Tag: matrix

使用SlimDX时剪辑和3D投影不正确

我正在开发一个简单的项目,我希望使用SlimDX在WinForms应用程序中显示一个3D对象。 我已经创建了一个小项目,但我遇到的问题是我渲染的对象被剪切在0.0f和-1.0f之间。 我看了一个朋友的类似项目的代码(他们没有这个问题),并且无法弄清楚它为什么会发生。 我必须将对象的大小限制在-0.1f – > 0.1f的范围内,以便我能够看到它。 延伸我的远程飞机什么也没做。 我朋友正在使用的项目可以加载超过我的500倍的对象,没有剪切问题。 有没有人有什么建议? (请参阅下面的屏幕截图和代码) 表格代码 namespace TestOfTheTest { using System.Drawing; using System.Windows.Forms; using SlimDX; using SlimDX.Direct3D9; using MathHelper = Microsoft.Xna.Framework.MathHelper; public struct VertexPositionColor { private static VertexDeclaration sDeclaration; public static VertexElement[] Elements = { new VertexElement(0, 0, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Position, 0), new VertexElement(0, sizeof(float) * 3, DeclarationType.Float4, DeclarationMethod.Default, […]

设置着色器的矩阵

我想绘制实例立方体。 我可以调用GL.DrawArraysInstanced(PrimitiveType.Triangles, 0, 36, 2); 成功。 我的问题是所有的立方体都是在相同的位置和相同的旋转绘制的。 我怎样才能为每个立方体单独更改? 要创建不同的位置等,我需要每个立方体的矩阵,对吧? 我创造了这个: Matrix4[] Matrices = new Matrix4[]{ Matrix4.Identity, //do nothing Matrix4.Identity * Matrix4.CreateTranslation(1,0,0) //move a little bit }; GL.BindBuffer(BufferTarget.ArrayBuffer, matrixBuffer); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(sizeof(float) * 16 * Matrices.Length), Matrices, BufferUsageHint.StaticDraw); 这应该创建一个缓冲区,我可以存储我的矩阵。 matrixBuffer是指向我缓冲区的指针。 我不确定大小是否正确,我采用浮动* 4(对于Vector4)* 4(对于4个向量)*数组大小。 绘制循环: GL.BindBuffer(BufferTarget.ArrayBuffer, matrixBuffer); GL.VertexAttribPointer(3, 4, VertexAttribPointerType.Float, false, 0, 0); //GL.VertexAttribDivisor(3, ?); GL.EnableVertexAttribArray(3); GL.DrawArraysInstanced(PrimitiveType.Triangles, 0, […]

用于访问N(未知)维度矩阵中的所有点的算法

我有一个多维矩阵,可以有任何数量的维度大于一。 寻找可以访问矩阵中每个点的有效算法。 关于代码的一些信息:矩阵具有值访问器(尽管这些并不真正相关)。 object value = matrixInstance.GetValue(int[] point); matrixInstance.SetValue(object value, int[] point); 注意:参数点是索引数组,必须与维度匹配,否则抛出exception。 有关矩阵结构的信息可以通过以下方式获得: int numDims = matrixInstance.Rank; //# dimensions int sizeDim = matrix.getRankSize(int index); // length of specified dimension 我想使用相对有效的算法迭代矩阵的所有可能点。 例如,在2×3 2D矩阵中,将访问以下六个点: [0,0] [0,1] [0,2] [1,0] [1,1] [1,2] 该算法必须达到N维:2,3,4等。 为了提高效率,我最终会使用C#迭代器来返回点数。

DirectX:查看矩阵的世界 – 我的误解在哪里?

我开始使用DirectX(和SharpDX,因此仅在C#/ hlsl中编程)并且我正在尝试构建自己的相机类。 它应该是可旋转的,允许向前和向后移动以及“侧向”运动(经典的第一人称运动通常映射到A和D,在我的情况下加上和向下)。 为了更容易修复错误,模型和世界空间在我的情况下是相同的,透视投影尚未实现,旋转相机,我的相机应该在正Z轴(进入屏幕)。 我的错误修正模型是一个简单的四边形,宽度和高度为1.f,z = 0并且在屏幕上居中。 为了便于使用,我找到了DirectX的Matrix.LookAtLH()并使用它来构建我的矩阵,用于从世界到视图坐标的平移,基于我的相机在世界坐标中的位置,向上矢量(现在 – 没有旋转 – 总是正Y轴)和世界坐标中的目标点。 我的(顶点)着色器使用此矩阵的简单乘法: output.position = mul(position, worldToView); LookAt-Matrix计算如下: Matrix.LookAtLH(vec3(0, 0, -1), vec3(0, 0, 0.5f), vec3(0, 1, 0)) 得到这张图片: 现在我想将相机移到右边,在这种情况下,将1.f添加到它的X坐标。 我的预期结果与之前的四元组相同,向左移动了一点。 我构建了一个新的LootAt矩阵,通过相同的向量移动眼睛坐标和目标坐标: Matrix.LookAtLH(vec3(1, 0, -1), vec3(1, 0, 0.5f), vec3(0, 1, 0)) 结果如下: 我移动相机越多越好,但屏幕中心仍保持四边形的中心。 这与我对Matrix.LookAtLH潜在误解有关吗?

在emgu cv中使用矩阵

我在EMGU cv中有一个图像的矩阵(2D),如何用零填充矩阵的其余部分,但保留一个原始数据的区域(矩形)?

将euler转换为矩阵,将矩阵转换为euler

我正在尝试使用.NET / C#将使用欧拉角度描述的3D旋转转换为矩阵然后返回。 我的约定是: 左撇子系统(x右,y上,z前进) 旋转顺序:绕y前进,绕x旋转,绕z倾斜 使用左手规则(拇指指向+无穷大)旋转是正的 我的试用期是: Euler到矩阵 (为了简化,我删除了x,y,z平移部分) Matrix3D matrix = new Matrix3D() { M11 = cosH * cosB – sinH * sinP * sinB, M12 = – sinB * cosP, M13 = sinH * cosB + cosH * sinP * sinB, M21 = cosH * sinB + sinH * sinP * cosB, […]

XNA ViewPort投影和SpriteBatch

我正在开发一个XNA游戏,我正在使用ViewPort.Project和ViewPort.Unproject来转换世界坐标和从世界坐标转换。 目前我将这些用于我使用SpriteBatch绘制的每个对象。 我想做的是计算一个矩阵,我可以发送给SpriteBatch.Begin为我做屏幕空间转换。 以下是我目前用于在屏幕空间中进行翻译的function: Vector2 ToWorldCoordinates(Vector2 pixels) { Vector3 worldPosition = graphics.GraphicsDevice.Viewport.Unproject(new Vector3(pixels, 0), Projection, View, Matrix.Identity); return new Vector2(worldPosition.X, worldPosition.Y); } Vector2 ToScreenCoordinates(Vector2 worldCoords) { var screenPositon = graphics.GraphicsDevice.Viewport.Project(new Vector3(worldCoords, 0), Projection, View, Matrix.Identity); return new Vector2(screenPositon.X, screenPositon.Y); } 视图设置为Matrix.Identity,Projection设置如下: Projection = Matrix.CreateOrthographic(40 * graphics.GraphicsDevice.Viewport.AspectRatio, 40, 0, 1); 以下是我目前的绘画方式: spriteBatch.Begin(); foreach (var thing in […]