2011-09-16 6 views
3

나는 JPS와 같은 JavaScript/Canvas 3D FPS와 같은 엔진을 사용하고 있으며 near plane과 far plane clipping을 위해 필연적으로 법선 벡터 (look-at vector)가 필요하다. 나는 x 축과 y 축 회전 각을 가지고 있으며 그 중 한 개에서만 쉽게 할 수 있지만 두 가지를 얻는 방법을 알 수는 없습니다 ...오일러 앵글에서 3D normal/look-at 벡터

아이디어는 다음과 같습니다. 이 벡터를 사용하여 카메라 앞의 한 점을 계산하면 near 및 far 클리핑 면도 상수로 정의 할 수 있어야 벡터가 정규화되어야하므로 각도 만 있으면이 벡터 길이를 얻을 수 있기를 기대합니다. 정상화하지 않고 1로,하지만 그건 문제가 아니야.

저는 롤 (z 축을 중심으로 회전)이 없으므로 훨씬 쉽습니다.

내 수학은 다음과 같습니다

zNear = 200; // near plane at an arbitrary 200 "points" away from camera position 

// normal calculated with only y rotation angle (vertical axis) 
normal = { 
    x: Math.sin(rotation.y), 
    y: 0, 
    z: Math.cos(rotation.y)}; 

은 그런 내적에 의해 그것에 비행기에서 벡터를 테스트하여 3D 공간에서 점을 클립. 포인트가 투영 좌표가 반전 플레이어 (x는 = -x, Y = -y) 그래서 아무것도 더 이상 의미가 없다 뒤에 때 내가 그들을 제거하기 위해 노력하고있어 왜

nearPlane = { 
    x: position.x+normal.x*zNear, 
    y: position.y+normal.y*zNear, 
    z: position.z+normal.z*zNear}; 

// test a point at x, y, z against the near clipping plane 
if(
    (nearPlane.x-x)*normal.x+ 
    (nearPlane.y-y)*normal.y+ 
    (nearPlane.z-z)*normal.z < 0 
) 
{ 
    return; 
} 

// then project the 3D point to screen 

, 즉이다.

enter image description here

나는 그러나 3 차원, 즉 녹색 화살표가합니다.

+0

2 점의 벡터 (AB와 BC)를 만드는 3 점 A, B, C를 주면 교차 제품을 사용하여 평범함을 얻을 수 있습니다 ... 도움이 될까요? – dustmachine

+0

@dustmachine : 아니요, 오일러 x 및 y 회전 각도에서 look-at vector가 필요합니다. 다른 데이터가 없습니다. – Solenoid

답변

2

약간의 집중적 인 뇌의 처리 후 나는

  1. 내 원래 모습-에서 벡터 (0, 0, 1)
  2. Z 축 회전 각도 (롤)는 항상 0
  3. 이었다 있다고 생각 하지 (0, 0, 1) 벡터에 전체 회전 행렬을 적용하고 내가 가진 솔루션 RZ = 0이었다 계정에 복용함으로써

을 작업 Wikipedia에있는 회전 행렬에 대한 이유가 없었다 :

normal = { 
    x: Math.cos(camera.rotation.x)*Math.sin(camera.rotation.y), 
    y: -Math.sin(camera.rotation.x), 
    z: Math.cos(camera.rotation.y)*Math.cos(camera.rotation.x)}; 

이제 모든 것이 완벽하게 작동합니다. 오류는 행렬을 조금 변경 한 모든 각도에 대해 rz = 0을 고려하지 않고 x 및 y 회전 행렬만을 사용했습니다.