環(huán)境:Ubuntu 10.04 + MilkShape 1.8.4 + Wine 1.2
方法:
1)在dll-files.com上下載msvcirt.dll, 注意是msvcirt.dll而不是msvcrt.dll.
2)在dlldump.com上下載mfc42.dll
3) 將上述兩個(gè)dll拷貝到system32目錄下和Milkshape的安裝目錄下(ms3d.exe所在的目錄)
4)使用wine運(yùn)行之
錯(cuò)誤: call to OpenGL ES API with no current context
可能的原因:OGL ES所在的線程被阻塞或者被掛起,導(dǎo)致渲染設(shè)備上下文丟失。
解決方案:將可能導(dǎo)致渲染線程被阻塞或被掛起的代碼移動(dòng)到別處。比如在渲染循環(huán)之前執(zhí)行或之后執(zhí)行。
1.采用右手坐標(biāo)系(OpenGL)
2.旋轉(zhuǎn)次序:x->y->z
3. 矩陣是列優(yōu)先存儲(chǔ)
1.什么是四元數(shù)?
直接用數(shù)學(xué)上的定義來(lái)解釋,因?yàn)槲液茈y在現(xiàn)實(shí)生活中找到可以描述明白的例子。
i, j, k 為虛數(shù)
Q = w + xi + yj + zk
其中w是實(shí)數(shù),而x,y,z為復(fù)數(shù)。
另外一種常見(jiàn)的表達(dá)方式是:
Q = [w, v]
其中v=(x,y,z)稱為矢量部(雖然稱為矢量,但是這個(gè)不是三維空間中的矢量,而是四維空間的,想象吧L),w稱為標(biāo)量部。
2.四元數(shù)可以做什么?
有了四元數(shù)的概念還不行,四元數(shù)可以干什么?四元數(shù)可以用來(lái)描述方向。
先來(lái)看下如何求取四元數(shù)的長(zhǎng)度:
||q|| = Norm(q) = sqrt(w2 + x2 + y2 + z2)
單位長(zhǎng)度的四元數(shù)有以下屬性:
w2 + x2 + y2 + z2 = 1
所以我們使用如下方法來(lái)標(biāo)準(zhǔn)化(Normalize)一個(gè)四元數(shù):
q = q / ||q|| = q / sqrt(w2 + x2 + y2 + z2)
使用一個(gè)單位四元數(shù)來(lái)描述方向,請(qǐng)記住必須是單位四元數(shù)才可以描述方向。
3.四元數(shù)的乘法
因?yàn)橐粋€(gè)單位四元數(shù)可以代表一個(gè)三維空間中的方向,那么兩個(gè)四元數(shù)相乘得到的結(jié)果仍然是一個(gè)四元數(shù),這個(gè)四元素依舊可以標(biāo)識(shí)一個(gè)方向。
給定兩個(gè)四元數(shù):
Q1 = (w1, x1, y1, z1)
Q2 = (w2, x2, y2, z2)
Q1 * Q2 = (w1.w2 – v1.v2, w1.v2 + w2.v1 + v1 x v2)
注意:.代表向量間的點(diǎn)積,x代表叉積。v1=(x1, y1, z1) v2=(x2, y2, z2)
優(yōu)化一下:
w=w1w2 - x1x2 -
y1y2 - z1z2
x = w1x2 + x1w2 + y1z2 - z1y2
y = w1y2 + y1w2 + z1x2 - x1z2
z = w1z2 + z1w2 + x1y2 - y1x2
4.四元數(shù)的轉(zhuǎn)換
為什么要轉(zhuǎn)換,因?yàn)槲覀冞€不能直接使用四元數(shù)來(lái)進(jìn)行3D物體的旋轉(zhuǎn)。在OpenGL中和Direct3D中都是通過(guò)矩陣來(lái)描述3D旋轉(zhuǎn)的。
4.1 四元數(shù)到矩陣的轉(zhuǎn)換
使用單位四元數(shù)轉(zhuǎn)換到矩陣:
Matrix = [ 1 - 2y2 - 2z2 2xy - 2wz 2xz + 2wy
2xy + 2wz 1 - 2x2 - 2z2 2yz - 2wx
2xz - 2wy 2yz + 2wx 1 - 2x2 - 2y2 ]
4.2 四元數(shù)到軸角的轉(zhuǎn)換
軸角也是一種表達(dá)空間旋轉(zhuǎn)的方式。
如果旋轉(zhuǎn)軸是:(ax, ay, az)
旋轉(zhuǎn)角度是:angle (單位:弧度)
那么四元數(shù)與軸角之間的轉(zhuǎn)換關(guān)系如下:
angle = 2 * acos(w)
ax = x / scale
ay = y / scale
az = y / scale
其中scale = sqrt(x2 + y2 + z2)
4.3 軸角到四元數(shù)的轉(zhuǎn)換
假設(shè)旋轉(zhuǎn)軸是(ax, ay, az),記得必須是一個(gè)單位向量。
旋轉(zhuǎn)角度是theta. (單位:弧度)
那么轉(zhuǎn)換如下:
w = cos(theta / 2 )
x = ax * sin(theta / 2)
y = ay * sin(theta / 2)
z = az * sin(theta / 2 )
4.4 歐拉角到四元數(shù)的轉(zhuǎn)換
如果你的歐拉角為(a, b, c)那么就可以形成三個(gè)獨(dú)立的四元數(shù),如下:
Qx = [ cos(a/2),
(sin(a/2), 0, 0)]
Qy = [ cos(b/2), (0, sin(b/2), 0)]
Qz = [ cos(c/2), (0, 0, sin(c/2))]
最終的四元數(shù)是Qx * Qy
* Qz的乘積的結(jié)果。
5.使用四元數(shù)來(lái)避免Gimbal
Lock
基本思路如下:
1) 使用一個(gè)四元數(shù)來(lái)標(biāo)識(shí)一個(gè)方向
2) 創(chuàng)建一個(gè)臨時(shí)的四元數(shù)來(lái)標(biāo)識(shí)當(dāng)前方向到新方向的變化
3) 右乘臨時(shí)的四元數(shù)和初始四元數(shù),結(jié)果是一個(gè)合并了兩個(gè)四元數(shù)的新的四元數(shù)
4) 將四元數(shù)轉(zhuǎn)換成矩陣
6.更深入的學(xué)習(xí)四元數(shù)
SLERP:球狀線性插值對(duì)于三位模型進(jìn)行動(dòng)畫處理非常有用,因?yàn)檫@種方式在模型的各種方向之間提供了平滑的轉(zhuǎn)換。