2011-12-07 35 views
0

我有我我的3D物體上旋轉的問題(這是在Java,但它並不重要)一般簡單的3D矩陣輪換問題

背景:

我有一個簡單的3D模型,並且您是第一人稱玩家,您將鼠標向上移動以查找(IE通過3D的x軸旋轉)並向下移動鼠標以向下看(向相反方向旋轉)

但:

我也有左,右箭頭鍵左/右(其中ro定位3D的Y軸)

現在的問題是,當我轉身時,當我旋轉x軸時,它不再像預期的那樣轉動,即如果轉動180度,通過向下移動鼠標,如果你移動鼠標,你實際上往下看。

我可以在x/y軸上執行什麼旋轉來解決這個問題?

所以不管我轉過多少/小,鼠標向上移動都會擡起來,鼠標向下移動會向下看。

對不起,我不能更好地解釋它,但如果你需要更多的信息只是發表評論。

非常感謝,

這是probabaly簡單的改造,但我想不出:(

一些Java的輪換代碼:

鼠標向上/向下:

public void rotateXY(double radians, double Yradians) 
    { 
     vpTrans.getTransform(T3D); 
     Transform3D test = new Transform3D(); 
     Transform3D testX = new Transform3D(); 
     Transform3D testY = new Transform3D(); 
     translate.set(lastXcord, lastYcord, lastZcord); 
     testX.rotX(radians); 
     testY.rotY(Yradians); 
     test.mul(testX, testY); 
     test.setTranslation(translate); 
     vpTrans.setTransform(test); 
     //System.out.println(test); 
    } // end of rotateXY() 

左圖:(右圖相似但帶有減號,而不是角度變化的加號)

public void run() { 
    Transform3D test = new Transform3D(); 
    Transform3D rotX = new Transform3D(); 
    Transform3D rotY = new Transform3D(); 

    vpTrans.getTransform(T3D); 
    translate.set(lastXcord, lastYcord, lastZcord); 
    angle += 0.05; 
    trueangle += 0.05; 
    rotX.rotX(angle); 
    rotY.rotY(Yangle); 

    test.mul(rotX, rotY); 

    test.setTranslation(translate); 
    vpTrans.setTransform(test); 
} 

我需要添加什麼轉換/旋轉,所以無論我的y軸,當鼠標向下移動時鼠標上下移動時,相機會查找?

+0

我可能在某些時候在解釋中混淆了X/Y軸,但您希望得到這個想法! –

回答

2

看起來你的轉換順序有問題。不像數字乘法,matrix multiplication is not commutative。 3D應用程序對轉換順序非常敏感。

英文:

如果xy是數字,然後x * y = y * x

但是,如果xy矩陣,然後x * yy * x

考慮到這一點,讓我們看看你在做什麼。

test.mul(rotX, rotY);

來可視化與這個乘法發生的事情,想象一下你有一個直線出來你的頭。我們將這個稱爲LineUp。現在看下你的鍵盤,想象一下LineUp與你傾斜。現在把你的頭轉到LineUp 90度。這就是你的旋轉矩陣發生了什麼。瘋了吧?

現在,讓我們反向乘法像這樣:test.mul(rotY, rotX);

所以,坐下直線上升,並期待着,並把你的頭/體/椅。現在往下看。您先旋轉一個真正的軸LineUp,然後應用上/下變換。好玩嗎?

思考矩陣變換的好方法就像一個必須按順序排列的指令集。

  1. 把頭向右轉。 (rotY
  2. 擡頭。 (rotX
  3. 移動到計算機(translate
  4. ...等

改變一個操作的順序改變滑稽和離譜的方式所有的後續指令。

你在建的是一臺相機,所以我強烈推薦reading how to build one

理解矩陣變換的一個很好的練習就是構建一個太陽系,它包含軌道衛星和旋轉行星。這將是開眼界和非常豐富的信息。