본문 바로가기
프론트엔드/Three.js

atan2

by 느바 2025. 2. 2.
반응형

atan2

Math.atan2(y, x)는 아크탄젠트(arctangent) 함수로, 양의 x축(0, 0)에서 (x, y)점까지의 광선 사이의 평면 각도(라디안 단위)를 반환합니다.

atan2(y, x)는 결과를 -π부터 π까지 반환하여 사분면을 정확히 판별할 수 있습니다.


Three.js에서 atan2 활용 사례

Three.js에서는 atan2를 주로 두 점 사이의 회전 각도를 계산할 때 사용합니다.
예를 들어 다음과 같은 경우에 활용할 수 있습니다.

  • 두 개체가 특정 방향을 바라보도록 설정
  • 카메라가 특정 개체를 바라보게 만들기
  • 2D 평면에서 캐릭터가 마우스를 향하게 만들기

예제: atan2로 오브젝트 회전하기

아래 코드는 Three.js에서 Math.atan2를 사용하여 마우스 위치에 따라 박스가 마우스를 바라보도록 회전하는 예제입니다.

import * as THREE from "https://unpkg.com/three@latest/build/three.module.js";

// 1. Three.js 기본 설정
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 2. 박스 생성
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const box = new THREE.Mesh(geometry, material);
scene.add(box);
camera.position.z = 5;

// 3. 마우스 위치 저장 변수
let mouse = { x: 0, y: 0 };

// 4. 마우스 이벤트 리스너 추가
window.addEventListener("mousemove", (event) => {
  // 마우스 좌표를 -1 ~ 1 범위로 변환 (WebGL 좌표계)
  mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
});

// 5. 애니메이션 루프
function animate() {
  requestAnimationFrame(animate);

  // 박스와 마우스 위치 비교 후 atan2로 회전 계산
  const dx = mouse.x - box.position.x;
  const dy = mouse.y - box.position.y;
  box.rotation.z = Math.atan2(dy, dx); // 회전 적용

  renderer.render(scene, camera);
}

animate();

 

실행 결과

  • 박스가 마우스의 방향을 따라 회전합니다.
  • atan2(dy, dx)를 사용하여 박스의 회전각을 올바르게 계산합니다.
  • mousemove 이벤트로 마우스의 위치를 실시간으로 추적합니다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2

 

Math.atan2() - JavaScript | MDN

Math.atan2() 정적 메서드는 Math.atan2(y, x)에 대해 양의 x축과 (0, 0)에서 (x, y)점까지의 광선 사이의 평면 각도(라디안 단위)를 반환합니다.

developer.mozilla.org

 

반응형

'프론트엔드 > Three.js' 카테고리의 다른 글

Raycaster  (0) 2025.02.01
Cannon.js  (0) 2025.02.01
Three.Clock  (0) 2025.02.01
오일러(Euler) vs. 쿼터니언(Quaternion)  (1) 2025.02.01
THREE.Euler  (0) 2025.02.01