在三維中常常需要重算正交的基向量組,
由于叉乘操作是有序的. 一般來說 : UxV不等于VxU,
所有往往記不住到底是哪個左向量乘哪個右向量求出
第三個向量,由于吃了一些虧所以做了總結.
i,j,k三個基向量, 如果你使用的圖形引擎Z往屏幕外面,
右手邊X和上方向Y規定為正方向的一組正交向量,如果
你使用的模型的基向量組和它相同,那么放心用.
ix
j=k, kx
i=j, jx
k=i 但是你可能不總是那么幸運.也許你打算使用Z往屏幕里面,
右手邊X和上方向Y規定為正方向的一組正交向量,這時你就
需要改變叉乘方式了
jx
i=k, ix
k=j, kx
j=i
也就是統統反過來使用就可以了.
但是如果你想使用Z往屏幕里面,右手邊X和下方向Y規定
為正方向的一組正交向量時這時你又需要怎么弄呢?
其實還是:
ix
j=k, kx
i=j, jx
k=i 如果你想使用Z往屏幕里面,左手邊X和下方向Y規定
為正方向的一組正交向量時這時你又需要怎么弄呢?
這時又是:
jx
i=k, ix
k=j, kx
j=i
也是統統反過來使用.
這時怎么得到得結論?
其實就是通過計算得到的
以下都假設x右為正方向,y上為正方向,z往屏幕外為正方向設備的環境
測試.
var vec3 = glMatrix.vec3;
console.log("-------------------->z軸往屏幕里為正的坐標系");
var u = vec3.fromValues(1,0,0)
var v = vec3.fromValues(0,1,0)
var w = vec3.fromValues(0,0,-1)
console.log(vec3.cross(vec3.create(), w,v));
console.log(vec3.cross(vec3.create(), u,w));
console.log(vec3.cross(vec3.create(), v,u));
console.log("-------------------->y軸向下為正的坐標系");
var u = vec3.fromValues(1,0,0)
var v = vec3.fromValues(0,-1,0)
var w = vec3.fromValues(0,0,1)
console.log(vec3.cross(vec3.create(), w,v));
console.log(vec3.cross(vec3.create(), u,w));
console.log(vec3.cross(vec3.create(), v,u));
console.log("-------------------->x軸向左為正的坐標系");
var u = vec3.fromValues(-1,0,0)
var v = vec3.fromValues(0,1,0)
var w = vec3.fromValues(0,0,1)
console.log(vec3.cross(vec3.create(), w,v));
console.log(vec3.cross(vec3.create(), u,w));
console.log(vec3.cross(vec3.create(), v,u));
console.log("-------------------->全部反為正坐標系");
var u = vec3.fromValues(-1,0,0)
var v = vec3.fromValues(0,-1,0)
var w = vec3.fromValues(0,0,-1)
console.log(vec3.cross(vec3.create(), w,v));
console.log(vec3.cross(vec3.create(), u,w));
console.log(vec3.cross(vec3.create(), v,u));
以上都能得到正確的向量組
console.log("-------------------->z軸往屏幕外為正坐標系");
var u = vec3.fromValues(1,0,0)
var v = vec3.fromValues(0,1,0)
var w = vec3.fromValues(0,0,1)
console.log(vec3.cross(vec3.create(), v,w));
console.log(vec3.cross(vec3.create(), w,u));
console.log(vec3.cross(vec3.create(), u,v));
console.log("-------------------->任意兩個是為負數的坐標系");
var u = vec3.fromValues(-1,0,0)
var v = vec3.fromValues(0,1,0)
var w = vec3.fromValues(0,0,-1)
console.log(vec3.cross(vec3.create(), v,w));
console.log(vec3.cross(vec3.create(), w,u));
console.log(vec3.cross(vec3.create(), u,v));
以上也都能得到正確的向量組.
結論就是如果偶數相反就正常使用,如果是奇數相反就
用反過來用.