第一人稱視角變換主要是view transformation matrix的變換
其實就是不斷變動eye point和camera look
at target的坐標
具備基本的三維數學和矩陣運算技巧就可以了
要弄清視角移動和轉動的原理
有必要先看看DX文檔的Matrices和View Transformation章節
文檔的相關
D數學原理和距陣計算以及接口方法搞清楚了
下面的工作就相當簡單
首先定義D
DXVECTOR
VDot
VAtPoint
VUp;
視景的移動
前後移動和左右移動
其實就是同時移動VDot和VAtPoint
即同時移動眼睛的位置和眼睛所看到的點的位置
代碼比較簡單
udragon在他的主頁上有一段代碼很清楚
可以參考
視角的轉動
原理就是繞通過VDot的矢量VUp旋轉VDot
即相當於站在原地旋轉Camera
udragon在他的主頁上關於視角旋轉的代碼寫得思路比較晦澀難懂
主要是他的思路比較特殊
幾乎在程序裡把某點繞軸旋轉的公式按數學證明推導了一遍
其實如果數學運算得當以及合理運用D
D接口方法
這段代碼可以簡化許多
可能用到的變量
D
DXVECTOR
pOut;
D
DXVECTOR
pOut
;
D
DXVECTOR
ab;
D
DXVECTOR
ac;
D
DXVECTOR
Vtemp;
D
DXMATRIX R
RT
R
;
//左右移動
D
DXVec
Normalize(&pOut
&ac);
`
RT = D
DXMATRIX(
VDot
x
VDot
y
VDot
z
);
D
DXMatrixRotationAxis( &R
&pOut
u);
R = RT * R
;
RT = D
DXMATRIX(
VDot
x
VDot
y
VDot
z
);
R = R * RT;
D
DXVec
Transform(&Vtemp
&VAtPoint
&R);
VAtPoint
x = Vtemp
x;
VAtPoint
y = Vtemp
y;
VAtPoint
z = Vtemp
z;
//上下移動
s
= D
DXVec
Length(&ab)*D
DXVec
Length(&VUp);
s
= (float)acos(D
DXVec
Dot(&ab
&VUp)/s
);
if(u>
)
{
if(s
<=
)
break;
}//一度
else
if(s
>=
)
break;
D
DXVec
Cross(&pOut
&ab
&ac);
D
DXVec
Normalize(&pOut
&pOut);
RT = D
DXMATRIX(
VDot
x
VDot
y
VDot
z
);
D
DXMatrixRotationAxis( &R
&pOut
u);
R = RT * R
;
RT = D
DXMATRIX(
VDot
x
VDot
y
VDot
z
);
R = R * RT;
D
DXVec
Transform(&Vtemp
&VAtPoint
&R);
VAtPoint
x = Vtemp
x;
VAtPoint
y = Vtemp
y;
VAtPoint
z = Vtemp
z;
From:http://tw.wingwit.com/Article/program/yxkf/201311/11084.html