개인 자료란 (JE)

  서버 커뮤니티

한국 마인크래프트 포럼

마인크래프트 자료 및 커뮤니티 플랫폼

전체 회원수 127,038명 ( +14명 )

※ 장기간 미활동 회원 제외

Profile BlueRing1017 한마포 창작자

BlueRing1017 b7720d9e22424408aca0a6ccc76240d1

Profile

커뮤니티new 개발자란new 개발자 강좌new 스크립트

스크립트에서 facing 구현

2021.08.03 조회 수 352 추천 수 5

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

저는 이 기능을 구현 하기 전까지 마인크래프트 기본 커맨드인 /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.09.26

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

BlueRing1017
2021.09.27
@허두

ㄷㄷ..

미초는미초
2021.08.11

흥미롭네요 블링씨^^

BlueRing1017
2021.08.28
@미초는미초

^^7

명이
2021.08.09

이런글은 추천으로...

세티스
2021.08.04

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

BlueRing1017
2021.08.06
@세티스

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

컨텐츠
https://www.koreaminecraft.net/files/thumbnails/952/941/002/262x150.crop.jpg?20211128203943

답안지

한마탐 수능 / 등급컷 + 해설 8

베개냥이

2021-11-25

2

https://www.koreaminecraft.net/files/thumbnails/670/940/002/262x150.crop.jpg?20211124215847

답안지

한마탐 5주차 / 정오표 + 해설 1

베개냥이

2021-11-24

2

https://www.koreaminecraft.net/files/thumbnails/133/938/002/262x150.crop.jpg?20211123001841
마인크래프트로 만든 움직이는 루디브리엄 3

LittleCharlotte

2021-11-22

7