2012-05-11 52 views
2

谷歌搜索後,我還沒有找到這個問題的答案,所以我要在這裏嘗試。圍繞一個對象在javascript中圍繞一個3d攝像機

使用(2d)畫布我在JavaScript中創建了一個3d世界,甚至還有一臺3D攝像機,它可以很好地工作。但是,相機是一個「免費相機」,因此當您旋轉時,相機會自行旋轉。

現在我想讓相機圍繞一個環境中的物體旋轉,但我很難理解如何做到這一點。

我嘗試下面的公式,但它怪胎之前,我甚至試圖旋轉......

this.x += (Math.sin(this.yd * (Math.PI/180)) * distance); 
this.z -= (Math.cos(this.yd * (Math.PI/180)) * distance); 

更新,以便FAR 多虧了WojtekT下面提供的anwser,我得到了到下面的代碼,它將攝像機轉向物體周圍,但也似乎放大...這可能只是我的眼睛愚弄我,因爲距離變量幾乎沒有變化(我認爲有一個小圓化問題,但除此之外它給出了預期的結果)

this.y = (Math.sin(this.yd * (Math.PI/180)) * distance + this.targetY); 
this.z = (Math.cos(this.yd * (Math.PI/180)) * distance + this.targetZ); 

其中this.yd是它應該以度數運行的速度。

我需要什麼配方?

編輯: 我不確定什麼的代碼片段可以幫助解決這個問題,所以這裏是完整的源:

http://clanpvp.com/sol http://clanpvp.com/js/sol/camera.js <相機對象,這可能。

由於調試的原因,當觸發按鍵事件時會加載一個新框架。 也用於調試,目標對象是一個固定點。在屏幕的中心。

箭頭鍵移動相機,WASD鍵開啓相機,至今只有W和S做一些事情,他們這樣做不對由於上面的代碼......

+0

你是什麼意思,'它嚇壞了'? – WojtekT

+0

我不太確定發生了什麼,但相機似乎會向後移動每一幀。我的猜測是,我使用的公式只是錯誤的,所以相機做了一些完全不同的東西,然後我想要 – Johan

+0

你能告訴我們更多的代碼嗎? –

回答

2

對於這個公式來工作,你必須有一些變化,改變每一幀。例如可變time

time += this.yd; 
this.x = (Math.sin(time * (Math.PI/180)) * distance); 
this.z = (Math.cos(time * (Math.PI/180)) * distance); 

否則Math.sinMath.cos返回相同值的每個幀。 基本上對於旋轉的東西,你需要提供隨時間變化的角度。在這個例子中,角度是可變的time

編輯: 我在我的答案中用替換爲=。這個計算爲您提供了準確的xz值,所以您不需要進行任何增量。

編輯2:

此公式也缺少旋轉中心。正確的計算應該是這樣的:

this.x = (Math.sin(this.yd * (Math.PI/180)) * distance + object_looked_at.x); 
this.z = (Math.cos(this.yd * (Math.PI/180)) * distance + object_looked_at.z); 
+0

當用戶按下某個鍵時,this.yd會被改變,抱歉不清楚這一點。我已經列出瞭如此希望的來源,讓事情變得更加清晰 – Johan

+0

是'this.yd'自轉速度還是旋轉速度? – WojtekT

+0

this.yd是自身的旋轉 – Johan