2010-11-20 64 views
5

我正在做一個小型項目,將數據集繪製到一個世界上。我已經完成了陰謀。現在我想實現相機移動。Processing&OpenGL - 更改相機位置?

我有一些代碼,如果用戶按住c並拖動鼠標,相機的位置就會改變。事情是,我不確定如何從鼠標移動計算相機移動。 (寬/ 2.0,高/ 2.0,(高/ 2.0)/譚(PI * 60.0/360.0),寬/ 2.0,高/ 2.0,0.0)相機代碼默認位置,1,0);

如何更改相對於鼠標拖動的相機位置? (我使用mouseX和mouseY的抵消相機眼位試過,但它不能很好地工作。)

+0

當你說這是「相機代碼」,你的意思是這是模型視圖矩陣?或者你是否使用了一個「相機」類/功能來完成一些幕後計算?移動場景的最簡單方法是完全忽略相機,然後改變場景本身。只需在所有正在渲染的X,Y,Z點上添加一個「相機偏移量」,這與您希望「相機」移動的位置相反。 – cecilkorik 2010-11-20 22:52:55

+0

我的意思是我想根據鼠標拖動來改變處理camera()方法中的變量。 – 2010-11-21 06:37:24

回答

2

如果你有方向矢量,您可以設置相機的位置如下(摘要代碼):

pos += speed * normalize(direction); 

這是爲了向前邁進。如果你想向後移動 - 只需將你的歸一化方向垂直乘以-1。對於掃射左右,使用的東西這樣的:

pos += speed * normalize(cross_product(direction, upvector)); // strafing right 
pos += speed * normalize(cross_product(upvector, direction)); // strafing left 

這裏是矢量運算的一些注意事項(從我的 「HelloWorld」 應用之一=)):

  • 正常化(VEC);返回vec,長度等於1;這一個「削減」vec到需要的長度
  • cross_product(vec_a,vec_b);返回vec_c,它指向vec_a和vec_b的垂線(更多信息請參見this article)。

cross_product的版本()看起來是這樣的:

Vector Vector::CrossProduct(const Vector &v) 
{ 
    double k1 = (y * v.z) - (z * v.y); 
    double k2 = (z * v.x) - (x * v.z); 
    double k3 = (x * v.y) - (y * v.x); 

    return Vector(NumBounds(k1), NumBounds(k2), NumBounds(k3)); 
    // NumBounds(v) returns 0 when v is less than 10^-8 
} 

希望這將有助於=)

1

我認爲迄今爲止最容易的事是使用peasycam庫

http://mrfeinberg.com/peasycam/

此庫將讓您可以使用鼠標訪問您的相機,您可以通過各種方式約束各種吸氣器,從而輕鬆訪問有關相機及其當前狀態的信息。