XNA2.0 API --- ViewPort.Unproject出错啦
生活随笔
收集整理的這篇文章主要介紹了
XNA2.0 API --- ViewPort.Unproject出错啦
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??????XNA2.0系統API居然出錯!折騰了我N久。現象是鼠標射線不準,莫名其妙的不準,有時旋轉一下相機就亂了,在官網論壇上找了一個替代版本,問題解決。這個問題XNA1.0并不存在,到2.0就有了,用反編譯查看,果然是XNA1.0使用DX實現,XNA2.0是重寫的方法。這個問題XNA論壇都提出來了,ViewPort.Unproject也算是一個比較重要的方法,居然到XNA3.0還存在,真不知道開發人員是怎么想的,為這個破問題折騰來折騰去,先前以為是相機問題,重寫了好多遍,看來即使是官方API也不要過于迷信,這回主要就栽在這點。
經驗總結:代碼使人寫的,不是神寫的,人寫的就會出錯,就這么簡單。最后附上可用的代替版本,看有多少可憐的孩子還在受到原API的毒害…
?
Code?1?public?static?Vector3?UnprojectEx(Viewport?viewport,?Vector3?screenSpace,Matrix?projection,?Matrix?view,?Matrix?world)??
?2?{??
?3?????//First,?convert?raw?screen?coords?to?unprojectable?ones??
?4?????Vector3?position?=?new?Vector3();??
?5?????position.X?=?(((screenSpace.X?-?(float)viewport.X)?/?((float)viewport.Width))?*?2f)?-?1f;??
?6?????position.Y?=?-((((screenSpace.Y?-?(float)viewport.Y)?/?((float)viewport.Height))?*?2f)?-?1f);??
?7?????position.Z?=?(screenSpace.Z?-?viewport.MinDepth)?/?(viewport.MaxDepth?-?viewport.MinDepth);??
?8?
?9?????//Unproject?by?transforming?the?4d?vector?by?the?inverse?of?the?projecttion?matrix,?
10?????//followed?by?the?inverse?of?the?view?matrix.????
11?????Vector4?us4?=?new?Vector4(position,?1f);??
12?????Vector4?up4?=?Vector4.Transform(us4,??
13?????????Matrix.Invert(Matrix.Multiply(Matrix.Multiply(world,?view),?projection)));??
14?????Vector3?up3?=?new?Vector3(up4.X,?up4.Y,?up4.Z);??
15?????return?up3?/?up4.W;?//better?to?do?this?here?to?reduce?precision?loss..????
16?}??
?
?
轉載請注明出處:
作者:gogoplayer
E-mail : gogoplayer@163.com
QQ : 78939328
http://www.gogoplayer.com.cn
轉載于:https://www.cnblogs.com/gogoplayer/archive/2008/10/30/1322800.html
總結
以上是生活随笔為你收集整理的XNA2.0 API --- ViewPort.Unproject出错啦的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORACLE START WITH 语句
- 下一篇: 微服务技术栈:API网关中心,落地实现方