Tag: 3d

如何创建三维散点图?

我一直在用C#做三维散点图的研究。 到目前为止,我找到了一个对我有用的库 。 但是,不一定像我需要的那样灵活。 由于我所需要的只是创建一个固定的三维散点图,在C#中使用Point3D结构或其他任何不需要我引入第三方库并且可能允许更好的灵活性的替代方案还有其他替代方法吗?

三角网格的良好数据结构

我正在为三维网格或由三角形组成的面集寻找一种节省内存且方便的数据结构。 目前我正在使用这种“经典”结构: 点列表和三角形列表。 每个点都有X,Y和Z值。 每个三角形有三个索引i0,i1,i2,它们指的是点列表中的一个点。 这是我能想到的最紧凑的布局。 如果我想做的就是绘制网格,并且永远不会修改或过滤它,这是完美的。 但是,它确实使大多数操作修改网格或生成新的部分网格非常麻烦,例如: 删除三角形是非常低效的。 仅生成少于3个邻居的三角形的新网格 查找并删除在给定边界框内具有一个或所有点的所有三角形 找到具有一定角度的所有边缘 去除短于一定长度的所有边缘 基本上任何需要修改网格,或迭代边缘或找到相邻面/边缘的东西,都需要生成和丢弃几个临时字典和散列集。 没有简单的方法可以迭代单个面的点或边,或单个点周围的边/面。 删除一个点意味着从每个三角形中删除它,然后更改所有三角形中所有其他点的索引值等。 是否有规范的数据结构没有这些缺点,但是内存效率高? 我不是在寻找一个完整的库,只是一个我自己可以实现的结构(尽管了解特定库如何解决这个问题可能很有趣)

XNA:当前顶点声明不包括当前顶点着色器所需的所有元素。 Normal0缺失

嘿,我有点麻烦。 我已经和xna合作了一段时间,但我对3D完全不熟悉。 我在msdn网站上的winformsgraphicsdevice示例中逐字跟踪代码。 它有一个控件,可以将原始三角形绘制到屏幕上。 很简单,但我在这一行得到一个例外: GraphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 1); 哪个说: “The current vertex declaration does not include all the elements required by the current vertex shader. Normal0 is missing.” 我假设它与我的VertexPositionColor变量vertices 。 那段代码在这里: vertices = new VertexPositionColor[3]; vertices[0] = new VertexPositionColor(new Vector3(-1, -1, 0), Color.Black); vertices[1] = new VertexPositionColor(new Vector3( 1, -1, 0), Color.Black); vertices[2] = […]

如何对Visual3D或UIElement3D等3D元素使用数据绑定

我在viewmodel中有一堆项目,我将使用Viewport3D在3D中渲染。 UI的相关部分定义如下: (我从上面的xaml中省略了光线和相机,但当然在我的代码中也存在) 现在我希望我的自定义控件将所有项目(来自我定义的Items依赖Items属性)呈现为位于其绑定对象指定位置的单个UIElement3D元素。 到目前为止,我的方法是覆盖GetVisual3DChild和相关的方法/属性,以设置我的项目的父子关系。 我面临的问题是如何将子的转换变换数据绑定到绑定对象中定义的值 – 由于UIElement3D不是从FrameworkElement派生的,因此没有SetBinding方法,因此没有明显的方法来指定代码绑定。 请注意,绑定转换在XAML中工作正常: 当我无法访问FrameworkElement.SetBinding时,如何从代码创建上述绑定?

在对象wpf的中心周围旋转cammera

表达式混合使您可以导入3d模型。 我想用代码为3d对象设置动画。 我似乎无法弄清楚为了使对象旋转我必须修改的属性值是什么。 让我告诉你我的意思: 所以,如果我想旋转这个物体,我可以使用相机轨道工具 如果我使用它,我最终会得到类似的东西: 我知道我可以创建一个故事板并通过修改对象来创建动画。 我需要使用滑块沿x轴旋转对象。 如果我只修改一个值,它将以一种奇怪的方式旋转,如果我愿意,我实际上必须更改几个属性。 例如,当我使用相机轨道工具沿x轴旋转物体时,我可以看到所有这些 属性正在发生变化 我需要弄清楚用于旋转对象的算法是什么。

如何在WPF中进行3D转换?

在flash10中, 我可以轻松地在3D空间中围绕其中心旋转图像。 我的flash10示例位于http://jsc.sourceforge.net/examples/web/MatrixStuffExample/Application.htm alt text http://jsc.sourceforge.net/examples/web/MatrixStuffExample/assets/MatrixStuffExample/Preview。 PNG 我想将此示例移植到WPF。 有没有一个例子如何在没有XAML的情况下在C#中的WPF中进行这样的3D转换? 在silverlight 3中,您将使用Matrix3DProjection。 你将如何在WPF中实现?

双线性插值 – DirectX与GDI +

我有一个C#应用程序,我已经编写了GDI +代码,它使用Bitmap / TextureBrush渲染来呈现2D图像,这些图像可以应用各种图像处理function。 此代码是模拟现有DX9代码的应用程序中的新路径,它们共享一个公共库以执行所有向量和矩阵(例如ViewToWorld / WorldToView)操作。 我的测试床由DX9输出图像组成,我将其与新GDI +代码的输出进行比较。 渲染到与Bitmap尺寸匹配的视口(即没有缩放或平移)的简单测试用例确实匹配像素完美(没有二进制差异) – 但是一旦图像被放大(放大),我就会得到非常小的差异在5-10%的像素中。 差异的大小是1(偶尔2)/ 256。 我怀疑这是由于插值差异造成的。 问题 :对于DX9正射投影(和身份世界空间),相机垂直并以纹理四边形为中心,期望DirectX.Direct3D.TextureFilter.Linear生成相同的输出到GDI + TextureBrush填充的矩形/多边形是合理的使用System.Drawing.Drawing2D.InterpolationMode.Bilinear设置? 对于这个(放大)情况,DX9代码正在使用它(MinFilter,MipFilter设置类似): Device.SetSamplerState(0, SamplerStageStates.MagFilter, (int)TextureFilter.Linear); 并且GDI +路径正在使用: g.InterpolationMode = InterpolationMode.Bilinear; 我认为“双线性插值”是一个相当具体的滤波器定义,但后来我注意到GDI +中还有另一种选择“HighQualityBilinear”(我尝试过,没有区别 – 考虑到“添加预滤波”的描述,这是有道理的缩小“) 后续问题:期望DirectX和GDI +之间的像素完美输出匹配是否合理(假设传入的所有外部坐标相等)? 如果没有,为什么不呢? 澄清:我正在使用的图像是使用Format32bppPArgb的不透明灰度(R = G = B,A = 1)。 最后,我可以使用许多其他API(Direct2D,WPF,GDI等) – 这个问题通常适用于比较“等效”双线性插值输出图像的输出。 谢谢!

C#中用于3D数学的好库?

我正在编写一个工具,用于处理一堆3D数据,像旋转对象,翻译,缩放和所有好东西。 有没有人知道一个好的图书馆已经做了一些常见的3D东西? 我对目前数据的可视化不感兴趣,并且主要对执行操作感兴趣。 我知道在这一点上我需要的东西: 2D / 3D / 4D向量 (加,减,点积,叉积等……) 使用矩阵进行旋转/平移/缩放 四元 我能够找到Sharp3D库,但它似乎可以做我想要的但是很长时间没有更新。 以前有人用过吗? 还有其他(更好的)建议吗?

如何将平面上的3D点转换为UV坐标?

我有一个3d点,由[x0, y0, z0] 。 该点属于由[a, b, c, d]定义的平面。 normal = [a, b, c]和ax + by + cz + d = 0 如何将3d点转换或映射到一对(u,v)坐标? 这一定非常简单,但我无法弄明白。

XNA View Matrix – 寻求解释

我在理解XNA中的视图矩阵时遇到了一些麻烦。 我已经与所有其他部分相距甚远,因为我刚刚学会了所需的数学,我不想使用内置的Matrix函数而不了解他们先做的事情。 现在我理解了旋转,投影和翻译的基础知识,但我无法理解视图矩阵在XNA中的工作原理。 从我收集的内容来看,视图矩阵应该将“世界”转变为它自己的空间。 看似合理,但库中的Matrix.CreateLookAt方法非常令人费解。 我已经建立(通过检查库函数输出的内容)这两段代码产生相同的结果: Matrix view = Matrix.CreateReflection(new Plane(Vector3.UnitX, 0)) * Matrix.CreateReflection(new Plane(Vector3.UnitZ, 0)) * Matrix.CreateTranslation(Position); // ..equals this if (Position = (0 0 -5), since LookAt “looks at” but the above just looks straight down Z).. Matrix blah = Matrix.CreateLookAt(Position, Vector3.Zero, Vector3.UnitY); 为什么要翻转X轴和Z轴? 我认为你应该根据摄像机的旋转来旋转世界,但是在相反的方向,然后在相反的方向上将世界翻转相同的量。 或者视图矩阵根本不用作转换,而只是编码摄像机在世界中的位置和旋转?