개인 자료란 (JE)

  서버 커뮤니티

Profile BlueRing1017 대표칭호 없음

BlueRing1017 b7720d9e22424408aca0a6ccc76240d1

Profile

강좌 자바 에디션(JE) 플러그인 개발

스크립트에서 facing 구현

2021.08.03 조회 수 2945 추천 수 6
분야 스크립트 
게임버전 모든버전 

스크립트를 짜다보면 어딘가를 바라보게 해야할 때가 있습니다.

저는 이 기능을 구현 하기 전까지 마인크래프트 기본 커맨드인 /tp 의 facing을 사용했고, 

커맨드를 쓰면 다들 알다시피 콘솔이 매우 더러워집니다.


실제로 구글링을 많이 해봤지만, 스크립트는 location 변수의 yaw값과 pitch 값으로 시야를 조절할 뿐, facing은 없습니다.

(제가 모르는 걸 수도 있습니다 :D)


그래서 facing을 어떻게 하면 구현할 수 있을까를 생각해 보았고, 꽤나 흡족한 결과가 나왔습니다.


일단 이 기능을 구현하기 위해서는 삼각함수를 알아야 하는데 간단히만 짚고 넘어가도록 하죠. 

(저는 이거 하려고 수학 공부했습니다. 최대한 쉽게 설명하도록 하죠.)


일단 삼각함수중 tan(탄젠트) 라는 친구가 있습니다. 이 친구가 뭐냐? 


81209151499a507435334a3ca632326d.png

위의 그림처럼 특정 각도를 넣게되면

337fee6b4142eba08f74efee22b5eacb.png

이렇게 기울기를 출력합니다.

(기울기는 다들 아시겠죠?)


하지만 여기서 문제가 있습니다. 

마인크래프트 내에서 yaw 값은 360도, pitch 값은 180도, 즉 각도가 필요하지, 기울기가 필요하진 않습니다.

또한 기울기는 내 좌표와 바라볼 좌표로 충분히 구할 수 있죠

yaw 의 기울기 : (좌표1의 x좌표 - 좌표 2의 x좌표) / (좌표1의 z좌표 - 좌표 2의 z좌표)

pitch 의 기울기 : (좌표 1과 좌표 2의 x,z축 평면 상의 거리) / (좌표 1의 y좌표 - 좌표 2의 y좌표)

따라서 우리는 반대로 기울기를 넣으면 각도를 주는, 역함수가 필요합니다.


마침 탄젠트의 역함수 arctan(아크탄젠트) 가 있네요.

또한, 스크립트에서는 이를 함수화 해서 편하게 사용 가능합니다.

atan() 과 atan2() 가 바로 그 주인공인데요.

atan() 은 말 그대로 기울기를 넣으면 각도를 출력해주는 함수 입니다.

atan2() 는 평면상 좌표 1을 (0,0) 이라고 가정하고, 좌표 2의 값을 넣으면,  x축과 좌표 1, 좌표 2를 이은 직선간의 각도를 출력합니다.

atan2() 가 더 사용하기 쉬워보이니, 저는 atan2()를 사용했습니다.


코드를 먼저 볼까요?

function facing2(e: entity, l: location):

    set {_loc} to location of {_e}

    set {_x} to x location of {_l} - x location of {_loc}

    set {_y} to y location of {_l} - y location of {_loc}

    set {_z} to z location of {_l} - z location of {_loc}

    set {_yaw.tan} to atan2({_x}, {_z})

    set yaw of {_loc} to {_yaw.tan} - 90

    set {_pit.dis} to ({_x} ^ 2 + {_z} ^ 2) ^ (1 / 2)

    set {_pit.tan} to atan2({_pit.dis}, {_y})

    set pitch of {_loc} to {_pit.tan} * -1

    teleport {_e} at {_loc}


위의 설명을 잘 읽으셨다면 이 코드를 이해하실거라 생각합니다.

(yaw 와 pitch 값에서 -90 과 * -1 은 시행착오를 거치면서 나온 결과입니다. 정확한 이유는 아직 모릅니다. 수학 싫어요)

그럼 잘 작동하는지 보죠.



/facing2 라는 명령어를 만들어, 주변의 에메랄드 블럭을 바라보게 만들었습니다. 

잘 작동 하네요!

다만, 에메랄드의 위를 바라본다는것인데,  이것의 이유는 

34bd1a0856857ad76b7b6ab47d68dc41.png

해당 사진처럼 엔티티의 좌표는 발바닥, 땅에 닿아있는 곳의 기준이기 때문에, 실제 시야가 있는 머리의 위치와 약 1.6칸 차이가 납니다.

이 차이가, 영상에서 나온것 처럼 약간 위를 바라보게 만드는 것이죠.

이것도 고치라면 고칠 수는 있겠는데, 너무 복잡해져서 다음에 기회가 되면 해보도록 하겠습니다.


생각보다 알아두면 매우 유용한 함수(무려 깨끗한 콘솔창)니, 잘 사용해보시기 바랍니다.

8개의 댓글

세티스
2021.08.04

블럭 좌표라 그런거같은데 테스트 해보니깐 {_l}의 y좌표에 -1.5정도 더해주면 딱 맞네요.

BlueRing1017
2021.08.06
@세티스

그렇게 보니 생각보다 간단한 문제였군요! 감사합니다 :)

명이
2021.08.09

이런글은 추천으로...

미초는미초
2021.08.11

흥미롭네요 블링씨^^

BlueRing1017
2021.08.28
@미초는미초

^^7

허두
2021.09.26

한마탐 기출문제 (메모메모)

BlueRing1017
2021.09.27
@허두

ㄷㄷ..

뉴스 및 창작물
/files/thumbnails/520/751/003/262x150.crop.jpg?20240328020349

레드스톤

마인크래프트 노트블록으로 만든 『 Bling‐Bang‐Bang‐Born 』 1

Sonttukk

2024-03-23

1

/files/thumbnails/467/742/003/262x150.crop.jpg?20240311163123

레드스톤

[노트블럭커버] MILGRAM -ミルグラム(밀그램)- / 아마네 「숙청 행진」 제 2심 2

리비온

2024-03-11

0

/files/thumbnails/846/741/003/262x150.crop.jpg?20240310221214

레드스톤

워든 vs 라마 200마리 1

GlassesFilm

2024-03-10

0

/files/thumbnails/542/739/003/262x150.crop.jpg?20240309070457

레드스톤

[고인의 명복을 빕니다][노트블럭]드래곤볼 GT 오프닝 - 점점 마음이 끌려

리비온

2024-03-09

0

/files/thumbnails/326/738/003/262x150.crop.jpg?20240328020414

레드스톤

마인크래프트 노트블록으로 만든 『 Build Our Machine 』

Sonttukk

2024-03-07

0

/files/thumbnails/952/735/003/262x150.crop.jpg?20240303230423

소식

복잡한 설치 없이 마크 애드온을 즐겨보세요! 새로운 블록, 몹, 조합법 등!

도라

2024-03-03

0

/files/thumbnails/212/735/003/262x150.crop.jpg?20240303113438

레드스톤

성장속도 실험

GlassesFilm

2024-03-03

3