먼저 should read this question입니다.
기본적으로 행렬은 x, y, z 벡터와 시스템 위치 (상위 시스템의 좌표 내)가 포함 된 좌표계입니다. 따라서 "LookAt"루틴을 사용하지 않고 행렬을 떼어 내고 벡터를 수정하고 행렬을 다시 작성할 수 있습니다. 중요한 점은, 카메라 매트릭스 (뷰 변환)는이 시점에서 카메라 대신 오브젝트가 배치 된 경우 오브젝트 매트릭스 (월드 변환)의 반대입니다. 그러나 카메라 행렬은 특별한 속성을 가지고 있기 때문에 (축은 직각이며 길이가 단위가 없습니다), 단순히 행렬을 조 변경하고 행렬의 "위치"부분을 다시 계산할 수 있습니다.
이 오래된 함수는 벡터 세트에서 카메라 매트릭스 ("뷰"변환 또는 D3DTS_VIEW)를 빌드합니다. x
포인트가 오른쪽이고 y
포인트가 위로, z
포인트가 앞으로, pos
이 카메라 위치입니다.벡터로
typedef D3DXVECTOR3 Vector3;
typedef D3DXMATRIX Matrix;
void vecToCameraMat(Matrix& m, const Vector3& x, const Vector3& y, const Vector3& z, const Vector3& pos){
m._11 = x.x;
m._12 = y.x;
m._13 = z.x;
m._14 = 0;
m._21 = x.y;
m._22 = y.y;
m._23 = z.y;
m._24 = 0;
m._31 = x.z;
m._32 = y.z;
m._33 = z.z;
m._34 = 0;
m._41 = - (pos.x*x.x + pos.y*x.y + pos.z*x.z);//(pos.x*x.x + pos.y*y.x + pos.z*z.x);
m._42 = - (pos.x*y.x + pos.y*y.y + pos.z*y.z);
m._43 = - (pos.x*z.x + pos.y*z.y + pos.z*z.z);
m._44 = 1;
}
해체 카메라 매트릭스 :
void cameraMatToVec(Vector3& x, Vector3& y, Vector3& z, Vector3& pos, const Matrix& m){
x.x = m._11;
y.x = m._12;
z.x = m._13;
x.y = m._21;
y.y = m._22;
z.y = m._23;
x.z = m._31;
y.z = m._32;
z.z = m._33;
pos.x = -(m._41*x.x + m._42*y.x + m._43*z.x);
pos.y = -(m._41*x.y + m._42*y.y + m._43*z.y);
pos.z = -(m._41*x.z + m._42*y.z + m._43*z.z);
}
그리고이 OBJECT 매트릭스를 구성한다 (즉 "세계"변환 또는 D3DTS_WORLD) 벡터들의 유사한 세트를 사용. 벡터의 집합으로
void vecToMat(Matrix& m, const Vector3& x, const Vector3& y, const Vector3& z, const Vector3& pos){
m._11 = x.x;
m._12 = x.y;
m._13 = x.z;
m._14 = 0;
m._21 = y.x;
m._22 = y.y;
m._23 = y.z;
m._24 = 0;
m._31 = z.x;
m._32 = z.y;
m._33 = z.z;
m._34 = 0;
m._41 = pos.x;
m._42 = pos.y;
m._43 = pos.z;
m._44 = 1;
}
해체 "개체"매트릭스 : 카메라
void matToVec(Vector3& x, Vector3& y, Vector3& z, Vector3& vpos, const Matrix& m){
x.x = m._11;
x.y = m._12;
x.z = m._13;
y.x = m._21;
y.y = m._22;
y.z = m._23;
z.x = m._31;
z.y = m._32;
z.z = m._33;
vpos.x = m._41;
vpos.y = m._42;
vpos.z = m._43;
}
, x
, y
및 z
는 1.0
의 길이를 가져야하고, 서로 직교한다.
이러한 루틴은 DirectX에만 해당되며 (보기) 행렬이 왼손잡이라고 가정합니다.
카메라를 "오른쪽"으로 이동하려면 매트릭스를 구성 요소로 나누고 "x"를 "pos"에 추가하고 다시 구성해야합니다. "보기"를 사용하기를 원한다면 "보기 위치"와 "위치보기"에 모두 "x"를 추가해야합니다.
카메라의 위치를 변경하고 항상 큐브를 보거나 카메라의 위치를 수정하고 회전 시키길 원하십니까? –
내 카메라는 항상 큐브를보고 고정 된 위치로 회전시키고 싶습니다. – Mo3r