首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XNA4.0中的Plane.Transform

XNA4.0中的Plane.Transform
EN

Stack Overflow用户
提问于 2013-07-15 18:39:12
回答 1查看 134关注 0票数 0

我今天注意到XNA4.0中的Plane.Transform似乎没有给出我期望的结果。

代码语言:javascript
复制
var s = Matrix.CreateScale(0.1f);
var p = new Plane(new Vector3(1.0f, 0.0f, 0.0f), 1.0f);
var p = Plane.Transform(p, s);

我原本期望飞机现在的星等为0.1f,但实际上它的距离为1,法线长度为10:

代码语言:javascript
复制
{Normal:{X:10 Y:0 Z:0} D:1}

这一切为什么要发生?

EN

回答 1

Stack Overflow用户

发布于 2013-07-15 20:17:53

我不能完全解释为什么,但是传递给transform方法的矩阵(你的比例矩阵)在应用到平面之前是反转的,所以你的比例从.1变成了10。

保存缩放和旋转数据的矩阵的3x3部分应用于平面的法线,这就是法线缩放的原因。

矩阵的第4行应用于平面的D部分,因此由于缩放矩阵在那里都是零(除了m44,它有1),所以平面的D部分保持不变。

缩放平面总体上没有多大意义,因为除了D部分之外,平面基本上是无量纲的。出于交叉测试的目的,法线应该始终保持在单位长度,因此缩放法线没有意义。如果你想要缩放D部分,它可以简单地myPlane.D *= 0.1f;,而不是试图用矩阵来转换它。

猜测如下:

矩阵求逆的一个可能原因是有两种方法来考虑D部分。

1.)从原点到平面的距离。

2.)从平面到原点的距离。

两者具有相同的值,但在方向方面却相反。MS选择将D视为从平面到原点的距离,这意味着方向与法线方向相反。很可能,这是有很好的理由的,但我不知道。这很可能会强制在Plane.Transform()方法中进行矩阵求逆。请看这里的图片:http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(MICROSOFT.XNA.FRAMEWORK.PLANE);k(DevLang-CSHARP)&rd=true

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17652257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档