C# 计算给定原点、方向和距离的矩形的左上角和右下角;大小
我对此进行了搜索,但没有找到一个与我的目标完全匹配的问题。我希望用户能够定义纹理平面。我掌握的参数有:C# 计算给定原点、方向和距离的矩形的左上角和右下角;大小,c#,xna,3d,vector-graphics,C#,Xna,3d,Vector Graphics,我对此进行了搜索,但没有找到一个与我的目标完全匹配的问题。我希望用户能够定义纹理平面。我掌握的参数有: 大小(矢量2) 方向(矢量3) 原点(矢量3) 因此,我希望能够计算出矩形的4个顶点,给出上述信息。因此,如果我想要一个面朝上的平面,宽度和高度为1000: 大小=(10001000) 方向=0,1,0(向上) 原点=0,0,0 这将在X&Z轴上定义一个面向上的平面。我不明白的是,在给定这些信息的情况下,如何计算3D空间中的4个角。我需要额外的信息,还是有更好的方法来任意指定平面 编辑
- 大小(矢量2)
- 方向(矢量3)
- 原点(矢量3)
- 大小=(10001000)
- 方向=0,1,0(向上)
- 原点=0,0,0
- 尺寸=10000,10000
- 中心=0,0,0
- 正常值=0,1,0
Vector3 arb = new Vector3(1, 1, 1); Vector3 planeY = Vector3.Normalize(Vector3.Cross(Normal, arb)); Vector3 planeX = Vector3.Normalize(Vector3.Cross(Normal, planeY)); planeX *= Size.X / 2; planeY *= Size.Y / 2; Vector3[] ret = new Vector3[4] { (Center - planeX - planeY), (Center - planeX + planeY), (Center + planeX - planeY), (Center + planeX + planeY) };
- 这是平面的定义:有一个点和法向量。您需要在平面上获得两个向量(A和B),并向原点添加一个(A*一个大小值)以获得第二个角点。添加第二个向量(B*其他大小值)以获得第三个角点,并将两个向量*其对应的大小值添加到原点以获得第四个角点
要获得第一个向量,请计算法向量(方向)与任意向量(不等于方向)的叉积。这将给出向量A。要得到向量B,请计算A与方向的叉积。您的平面尚未完全定义。你需要另一个沿着平面的向量,所谓的“切线”向量。在上面的示例中,纹理的Y轴应该指向哪里?沿着X轴,沿着Z轴?或者可能是一个完全不同的用户定义轴?切线向量是一个向量,它应该指向平面的X轴应该到达的一般方向 假设我们还有一个切向量,它不一定要指向平面。可以按如下方式构造平面:
Vector3[] vertices(Vector2 size, Vector3 center, Vector3 normal, Vector3 tangent)
{
Vector3 planeY = Vector3.Normalize(Vector3.Cross(normal, tangent));
Vector3 planeX = Vector3.Normalize(Vector3.Cross(normal, planeY));
planeX *= size.X / 2;
planeY *= size.Y / 2;
vertices = new Vector3[]
{
(center - planeX - planeY),
(center - planeX + planeY),
(center + planeX - planeY),
(center + planeX + planeY),
};
return vertices;
}
planeX和planeY是沿平面本身的X轴和Y轴指向的归一化向量。通过将它们乘以size/2,我们得到了两个向量,它们在X和Y方向上从平面的中心到边缘。通过以不同的方式将这两者相加,我们得到了四个角
这是一张图表,这样你可以在脑海中得到更好的画面。切线向量T被“展平”到X轴上。
谢谢您的帮助。我不完全清楚你所说的“任意向量(不等于方向)”是什么意思。我正试图想象这会是什么样子,但并没有走多远。感谢您的及时回复。好的,方向是一个3D向量,所以创建一个新的向量,其中任意3个值不等于方向向量的值。此项的叉积将为您提供一个与方向正交的标准化向量。您可以将这个新向量乘以其中一个大小属性来获得第二个角点。嗨,Hannash,谢谢您的评论和示例代码。假设在你的例子中,
tangent
是上向量,我重建了你传递的Vector3.UP
而不是tangent,但是planeY的值都是NaN
,所以不确定这里发生了什么。可能的原因是我的法线是0,1,0
,因为我希望这个特定的平面朝上。所以它被称为“Vector3.Cross”(“0,1,0”,“0,1,0”)。我确信这是错误的。这正是原因:),为up选择任何其他值,它就会正常工作。你不能定义一个平面,它的X轴方向和它面对的方向是一样的。我计算过了,所以我提供了一个(1,1,1)的上方向向量。假设原点为0,0,0
,法线为0,1,0
,大小为10000,10000
,我会得到一些非常奇怪的结果。[0]={X:0.0002441406 Y:0 Z:7071.068}
。[1] ={X:7071.068 Y:0 Z:0.0002441406}
,[2]={X:-7071.068 Y:0 Z:-0.0002441406}
和[3]={X:-0.0002441406 Y:0 Z:-7071.068}
。试图找出问题所在。我真的很感谢你在这方面的帮助。我刚刚用我现有的代码更新了我的帖子。说到数学和我,轮子在转动,但仓鼠死了。这看起来是对的。你在期待什么?该平面位于X&Z轴上(X&Z分量为~0)。可以沿对角线切线,因此平面旋转45度。尝试Vector3。左为“法线”平面。