2017-06-15 147 views
-1

我在OpenGL(WebGL)中有一個對象,我對它的外觀感到滿意,並且想將它移動到左側。但是,當我這樣做時,這是透視變化。我想保持它的樣子,然後在不同的地方渲染它。在屏幕座標中轉換對象

我正在使用一個相當標準的設置,我認爲,有一個投影和一個modelview矩陣。我嘗試以各種方式改變它們,但我只能讓我的對象在3D空間中移動,而不是在平面屏幕或眼睛座標中移動。任何想法如何做到這一點(沒有例如渲染到紋理)?


一些代碼摘錄。這些功能很明顯,它們來自Mozilla WebGL教程。我認爲確切的定義並不重要。

// set perspective matrix 
var perspectiveMatrix = makePerspective(45, 640.0/480.0, 0.1, 100.0); 
loadIdentity(); 
// set modelview matrix 
mvTranslate([0, 0, -12]); 
mvRotate(rotationAngle, [0, 1, 0]); 
// and then I just draw an object... 

在頂點着色器:

gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); 

說實話,我覺得具體的代碼是不是這個問題太重要了。請不要掛在上面。我可以使用Three.js或DirectX,或手寫的raytracer。我會重新制定了一個問題:在標準的形式主義,在屏幕座標從模型計算的矩陣乘法座標:

u = Perspective * ModelView * x 

我想在屏幕上移動u。我可以用手做到這一點:

u.x += deltaX 
u.y += deltaY 

但是有沒有辦法玩視角矩陣來獲得相同的效果?有沒有在視圖空間中引入轉換的「標準」方式? OpenGL中有一個方便的功能嗎?

+0

給我們一些相關的代碼。你使用glmatrix引擎嗎? –

+0

@NikolaLukic我不確定你想看到什麼代碼,答案不應該取決於它。無論如何,我添加了一些矩陣邏輯。但你可以想象任何簡單的OpenGL代碼,一個立方體。我想將立方體放在屏幕的一側,但我不想立方體顯示它的側面,或更改視角。我沒有使用glmatrix,但答案不應該與框架有任何關係。我正在尋找類似這樣的內容:「通過此乘以你的矩陣」或「使用glShiftScreen魔術功能」。 – jdm

+0

我想我可以通過在着色器中添加x和y座標來實現它,直到我滿意爲止,但我想知道正確的傳統方法。 – jdm

回答

0

好的,我想我已經想通了。要做翻譯,你需要乘上一個翻譯矩陣(這裏的語法來自Mozilla WebGL教程,該教程使用sylvester.js和它自己的函數的組合,但實際上只是把它想成僞代碼)。

以下內容將一個單位轉換爲左側,另一個單位轉換爲一側。

var shift = Matrix.Translation($V([-1, -1, 0])); 

如果你的對象是在屏幕的中間(0,0),以及您的座標從左下角走(-1,-1)到右上角(1,1),這個地方中間你的對象在左下角。

關鍵是現在要記住矩陣乘法一般是不可交換的。所以你不能這樣做perspective x something,它必須是something x perspective。這樣一來,當你成爲一個模型向量,角度首先應用,然後你的轉變:

var shiftedPerspectiveMatrix = shift.x(perspectiveMatrix) 

作爲獎勵,這裏是如何在像素做到這一點的座標:

// for referece: 
var perspectiveMatrix = makePerspective(45, 640.0/480.0, 0.1, 100.0); 
var trans = Matrix.Translation($V([-1, -1, 0])); 
var scale = Matrix.Diagonal([320, 240, 1, 1]); 
// move 100 pixels to the left 
var viewShift = Matrix.Translation($V([-100, 0, 0])); 

let transI = trans.inv(); 
let scaleI = scale.inv(); 
var newPerspectiveMatrix = transI.x(scaleI).x(viewShift).x(scale).x(trans).x(perspectiveMatrix); 

需要記住的是,當M是矩陣時,M -1 M是無操作的。在應用M後,您將生活在不同的座標系中。所以,如果變換要應用在不同的座標系被定義,你可以做X」 = 中號-1 A M X

對不起,如果我搞亂訂單的東西。自解析幾何和線性代數已經有很長一段時間了。

現在,上面的代碼所做的是將座標轉換爲人類可理解的系統(屏幕像素,儘管以中心爲原點),應用了我想要創建的偏移,然後轉換回OpenGL-可理解的系統。請注意,應用程序是從右到左的,我以相反的順序撤消操作。

相關問題