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出错啦相关推荐

  1. 天地图,js 4.0 api,简单调用,高手请绕行

    本文介绍使用天地图 js4.0 api,实现地图显示后台gps分布情况: 主要借用H5 GPS获取,利用天地图的背景展示: 效果图如下: 第一步,通过采集网页,手机gps数据,录入后台数据库:界面如下 ...

  2. php 接口 2.0,YII 2.0 API接口开发

    YII2.0 API接口开发 首先先安装 YII2.0 高级模板(安装请参考其他教程) 准备 添加数据库配置 common/config/main-local.php image 把backend目录 ...

  3. java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader, but this RI(xxx

    在使用webservice,mule esb等需要jaxb的项目里经常会出现 JAXB 2.0 API is being loaded from the bootstrap classloader这个 ...

  4. android preferenceactivity 源码,PreferenceActivity PreferenceScreen (3.0/API 11 以前)

    Android提供了一个XML驱动的框架,用于为应用程序创建系统样式的PreferenceScreen. (3.0/API 11 以前)是这样使用的 看代码: mypreference.xml and ...

  5. Android 5.0 API 的变化——开发人员注意

    Android 5.0 API变化 译自 http://developer.android.com/intl/zh-cn/about/versions/android-5.0.html -- By N ...

  6. 本周ASP.NET英文技术文章推荐[03/23 - 04/05]:C#、Visual Studio、MVC、死锁、Web 2.0 API、jQuery、IIS7、FileUpload...

    摘要 本期共有9篇文章: 提高C#和Visual Studio 2008生产力的10个技巧 ASP.NET MVC Action过滤器:缓存和压缩 程序停止工作及其解决方法:第一部分:死锁 调用Dig ...

  7. android版本兼容API24,Android 7.0 (API 24) 适配

    Android 7.0 (API 24) 适配 电池和内存 低电耗模式 此项新增的行为不会影响有关使您的应用适应Android 6.0(API级别23)中所推出的旧版本低电耗模式的建议和最佳做法,如对 ...

  8. Android开发者福利之--------Android 6.0 API

    Android 6.0 API 着手开发 要着手开发 Android 6.0 应用,您必须先获得 Android SDK,然后使用 SDK 管理器下载 Android 6.0 SDK Platform ...

  9. 西门子博途安装服务器未响应,博途V13.0安装过程中出错

    悬赏: 1西币 | 解决时间:2016-05-21 19:31 博途V13.0安装过程中出错 BUNDLE: SIMATIC STEP 7 Professional V13.0 SEBU Versio ...

最新文章

  1. 你最喜欢的一张美女图片?
  2. canvas用2d渲染出3d的感觉
  3. CGAL window 10安装、Demo使用步骤以及问题解决记录
  4. java 类型推理_java 11 局部变量类型推断
  5. 女博士7年不毕业,她破解了“量子计算最基础问题”
  6. JavaEE基础(02):Servlet核心API用法详解
  7. 响应式网页设计应该注意的9个原则
  8. bundle文件解压_通过sourcemap解压缩webpack 实战
  9. 【原理篇】推荐系统之矩阵分解模型
  10. 央视频卫视app直播收看教程(2021)
  11. 【USACO题库】3.4.4 Raucous Rockers“破锣摇滚”乐队
  12. 盘点IT职场“最差”程序员,这7个特征尤为典型!
  13. canvas教程12-阴影
  14. Sonic常见问题解决方法之——设备中心出现多个iOS设备接入异常
  15. 学习UI设计需要学习哪些软件?
  16. 【教程】【技术向】将博客批量导出为markdown或html格式
  17. Android 动态加载多版本SDK之DexClassLoader实践
  18. uni-app 动态添加class
  19. Mac 为 Homebrew 设置代理
  20. 大数据之路 阿里巴巴大数据实践 读书笔记

热门文章

  1. java 模拟form_java模拟form上传数据
  2. 神策 2021 数据驱动大会,科特勒、桑文锋等发出营销未来之强音
  3. Android•Lottie动画库填坑记
  4. 程序安装后依然是老版主页的修改办法
  5. C#操作word文档(二)
  6. Communication boosts value
  7. how can you understand the world
  8. 什么是formal method的invarient
  9. 【转】UNITY中相机空间,投影空间的正向问题
  10. 【转】C++ traits技术