java xy,java – 某个z深度的xy位置
我強烈建議你研究一些線性代數或矩陣數學用于3d圖形.它既有趣又簡單,但比SO答案要長一點.我會嘗試:)免責聲明:我不知道你正在使用的API!
看起來你正在為一個位置返回3個坐標(通常稱為頂點).但是你也提到了一個投影矩陣,該函數有4個坐標.通常,著色器或API將為頂點采用4個坐標. X,Y,Z,W上.要在屏幕上顯示它們,它會執行以下操作:
xscreen = x/w
yscreen = y/w
zbuffer = z/w
這很有用,因為你可以選擇w.如果你只是做2d繪圖,你可以把w = 1.但是,如果你正在做3D并想要一些透視效果,你想要除以相機的距離.這就是投影矩陣的用途.它主要取你的點的z,其中z表示與相機的距離并將其置于w中.它也可以擴展一些東西,比如視野.
回顧一下您發布的代碼,這正是最后一個ScreenXImpl函數所做的.
它應用一個投影矩陣,它主要只是將z移動到w,然后除以w.最后它做了一個額外的比例并從(-1,1)偏移到(0,widhtinpixels),但我們可以忽略它.
現在,我為什么要談論這些東西呢?你想要做的就是獲得給定的xscreen,yscreen,zbuffer的x,y,z坐標,對嗎?好吧,訣竅就是倒退了.為了做到這一點,你需要牢牢抓住前進:)
倒退有兩個問題:1)你真的知道或關心zbuffer值嗎? 2)你知道投影矩陣是做什么的嗎?
1)讓我們說我們不在乎.這有很多可能的值,所以我們可能只選擇一個.對于2)你將不得不看看它做了什么.一些投影矩陣可能只取(x,y,z,w)和輸出(x,y,z,1).那將是2d.或(x,y z,z,1)將是等距的.但從視角來看,它通常會(x,y,1,z).加上一些縮放等等.
我剛注意到你的第二個screenXImpl已經將x,y,z,w傳遞到下一個階段.這有時是有用的,但是對于w將為1的所有實際情況.
在這一點上,我意識到我在解釋事情上很糟糕. :)你真的應該拿起那本線性代數書,我從這一本書中學到了:http://www.amazon.com/Elementary-Linear-Algebra-Howard-Anton但它帶來了一個很好的講座,所以我不知道它有多么有用.
無論如何!讓我們變得更實際.回到你的代碼:screenXImpl的最后一個功能.我們現在知道輸入w = 1并且ow = ~z和ox = ~x;這里的波浪線意味著一些規模加上一些偏移.我們必須開始的屏幕x是~ox / ow. (1/2,*寬..這是波浪線的意思).現在我們回到1)…如果你想要一個特殊的盎司 – 現在選擇一個.否則,我們可以挑選任何.對于渲染,在相機前挑選任何東西并且易于使用可能是有意義的.喜歡1.
protected float screenXImpl(float x, float y, float z, float w==1) {
float ox = 1*x + 0*y + 0*z + 0*w; // == x
float ow = 0*x + 0*y + 1*z + 0*w; // == z == 1
ox /= ow; // == ox
float sx = width * (1 + ox) / 2.0f;
return sx;
}
WTF? sx =寬*(1牛)/ 2?我為什么不這么說呢?好吧,我放在那里的所有零都可能不是零.但它最終會變得如此簡單.可能不是那些人.我試圖展示你必須做出的重要假設才能回歸.現在它應該像從sx回到牛一樣容易.
那是困難的部分!但你仍然需要從最后一個功能到第二個功能.我想第一個第二個很容易. :)該函數正在進行線性矩陣變換.這對我們有好處.它需要輸入四個值(x,y,z)和(w = 1)隱式輸出四個其他值(ax,ay,az,aw).我們可以弄清楚如何手動返回那里!我必須在學校這樣做..四個未知數,四個方程式.你知道ax,ay,az,aw …求解x,y,z你得到w = 1是免費的!非常可能和良好的運動,但也很乏味.好消息是這些方程的編寫方式稱為矩陣. (x,y,z,1)* MODELMATRIX =(ax,ay,az,aw).真的很方便,因為我們可以找到MODELMATRIX ^ -1.它被稱為逆!就像1/2是2乘以實數的倒數,或-1是加1的倒數.你真的應該讀一下這很有趣而不是很難,順便說一下:).
無論如何,使用任何標準庫來獲得模型矩陣的逆.可能類似于modelView.Inverse().然后用它做同樣的功能然后你倒退.簡單!
現在,為什么我們之前沒有對PROJECTION矩陣做同樣的事情呢?很高興你問!那一個需要4個輸入(x,y,z,w)并且只吐出三個輸出(screenx,screeny,zbufferz).所以沒有做出一些假設我們無法解決它!一個直觀的方式來看,如果你有一個3d點,你在二維屏幕上投影,那將會有很多可能的解決方案.所以我們必須選擇一些東西.而且我們不能使用方便的矩陣逆函數.
如果這有點有幫助,請告訴我.我覺得它不是,但我寫得很開心!另外google for unproject in processing給出了這個:http://forum.processing.org/topic/read-3d-positions-gluunproject
總結
以上是生活随笔為你收集整理的java xy,java – 某个z深度的xy位置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flyway配置mysql_Flyway
- 下一篇: sap系统搭建教程_詹迟迟:如何搭建知识