Tag: 3d

3D中两个矩形之间的交点

为了获得3D中两个矩形之间的交线,我将它们转换为平面,然后使用它们法线的叉积得到交线,然后我尝试使线与矩形的每个线段相交。 问题是线条平行于三个线段,并且只与NAN,NAN,NAN中的一个相交,这是完全错误的。 你能告诉我我的代码有什么问题吗? 我使用此链接中的vector3 http://www.koders.com/csharp/fidCA8558A72AF7D3E654FDAFA402A168B8BC23C22A.aspx 并创建了我的飞机课程如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace referenceLineAlgorithm { struct Line { public Vector3 direction; public Vector3 point; } struct lineSegment { public Vector3 firstPoint; public Vector3 secondPoint; } class plane_test { public enum Line3DResult { Line3DResult_Parallel = 0, Line3DResult_SkewNoCross = 1, Line3DResult_SkewCross = 2 }; #region […]

使用WPF进行透视变换

WPF允许在图形对象上指定线性仿射变换。 通过这种方式,您可以进行平移,旋转,缩放,倾斜或其组合。 您可以指定2×3矩阵。 我想要做的是2D空间中的透视变换,它需要3×3矩阵,并且可以从Photoshop或GIMP中获知,您可以在其中独立拖动图像的所有4个角。 我尝试使用WPF的3Dfunction,设置Viewport3D , OrthographicCamera并将(2D)对象放置在xy平面上。 但我想知道在WPF中是否有更简单的方法来完成透视转换? 我也问,因为我想对文本进行透视变换:在2D中我可以使用TextBlock ,在3D中它变得更加复杂,我必须从FormattedText创建一个Geometry的Brush 。

使用SetTarget方法定位多个对象的故事板不起作用

任何人都可以帮助我找出为什么这不起作用。 Brush变量包含一个预先填充的画笔列表。 如果我尝试在迭代期间直接应用BeginAnimation ,它可以正常工作。 但是每个动画分别开始有很大的开销…… 所以我试图将所有动画放在一个故事板中,然后立即将它们全部解开…… var storyBoard = new Storyboard(); var duration = new Duration(TimeSpan.FromMilliseconds(time)); foreach (Brush brush in brushes) { var animation = new DoubleAnimation(toValue, duration); storyBoard.Children.Add(animation); Storyboard.SetTargetProperty(animation, new PropertyPath(Brush.OpacityProperty)); Storyboard.SetTarget(animation, brush); } storyBoard.Begin(); 这段代码什么都不做(我可以看到……)。 谢谢!! 编辑:仍然不确定SetTarget方法有什么问题,要么是一个bug,要么我只是不应该使用它。 无论如何,我解决了在运行时使用SetTargetName方法为我的画笔生成唯一名称的问题。 再次感谢所有的建议。

WPF3D如何操作与摄像机平行的平面中的对象

我正在WPF中申请。 我正在使用很多3DTools 。 我有一个四面体,里面有一个立方体。 我想在3D方向上移动立方体。 我的四面体以(0,0,0)为中心,使用轨迹球旋转(以编程方式,我在视口上有一个透明边框来捕捉事件)。 应用程序的用户认为更自然地在其中移动立方体的方法是将其始终移动到2D平面(与屏幕平行)。 因此,如果我想在屏幕中更深地移动它,我只需旋转四面体并在Y轴上移动它,例如。 我认为这可能是一个很好的解决方案。 我有问题,我想帮助解决问题:首先,当我移动四面体(在轨迹球内)时,轨迹球看起来像移动所有系统坐标。 我这样说是因为我为了调试目的画了轴,那些轴也在旋转。 但事实并非如此 – 它们只是因为轨迹球内的物体而移动(对吗?)。 编辑实际上,我认为轨迹球内部的坐标系正在发生变化。 当我在YX轴上移动立方体时,我表现不错。 但如果我稍微转一下,并尝试在Z轴上移动,我会看到它越来越大(离相机越来越近)越来越小(远离相机)。 =( 所以我的问题是如何定义一个不会被轨迹球旋转的平面? 对我来说,答案看起来像“好吧,只是在轨道球之外定义”但是,正如我所说的(和3DTools文档说的那样)我的视口上有一个边框……所以我不知道如何处理这个问题。 我的四面体在一组ScreenSpaceLines3D中。 我必须把立方体放在里面。 我的第二个问题是如何跟踪旋转的四面体顶点的位置 ? 当位置属性给我原始位置而没有别的时候,我真的很失望。 我应该保留矩阵变换,然后在我需要时应用到我的观点吗? 很抱歉很长的文字,但我真的陷入了这个没有那么多的编程问题。 我在WPF中知道,我仍然缺乏一些概念。 提前致谢, 佩德罗

使Camera LookDirection看起来正面

如何在WPF查看3D模型的前端? 我很困惑为LookDirection设置XYZ。 我不知道当我设置xyz时会发生什么,我不知道相机在哪里看。 对于UpDirection我不知道同样的事情。 以下是我的相机属性: camera.Position = new Point3D(100, 100, 150); camera.LookDirection = new Vector3D(-100, -100, -100); camera.UpDirection = new Vector3D(0, 0, 1); 问题是相机从后面看。 模型显示为下面的立方体。 如何使它看起来正面? 另请解释如何设置xyz。 我知道什么属性做但我无法想象他们。 我认为X是从右到左.Y是深度。 Z是最多的。

将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, […]

C#中线段与轴对齐框的交点

我正在寻找一种算法来确定线段和轴对齐框之间的近交点和远交点。 这是我的方法定义: public static Point3D[] IntersectionOfLineSegmentWithAxisAlignedBox( Point3D rayBegin, Point3D rayEnd, Point3D boxCenter, Size3D boxSize) 如果线段不与框相交,则该方法应返回空的Point3D数组。 从我到目前为止的研究中,我发现了一些高度优化算法的研究论文,但它们似乎都是用C ++编写的,需要将多个长类文件转换为C#。 对于我的目的,一些相当有效的东西,易于理解的人获得点产品和交叉产品,以及简单/短期将是首选。

计算在接缝处结束的2个网格之间的法线

我的任务 我目前正在为Unity3D创建一个地形,专门用于运行应用程序的内存不足的移动设备。 允许大小为15.000 x 15.000千米,高度为-1.000米到10.000米的地形,它的唯一限制是硬盘上的空间。 情况 现在一切都运行正常,除了不正确地计算不同网格之间的法线(每个网格具有细分级别)。 这是两张可视化问题的图片: 问题仅发生在从一个细分级别到另一个细分级别的转换中。 如果两个网格具有相同的级别,则效果很好。 我首先想到在计算法线时我会错过一些面孔,但似乎它们都包含在计算中。 一些代码 每张脸的正常计算: Vector3 u = vertices[item.Face1] – vertices[item.Face0]; Vector3 v = vertices[item.Face2] – vertices[item.Face0]; Vector3 fn = new Vector3((uY * vZ) – (uZ * vY), (uZ * vX) – (uX * vZ), (uX * vY) – (uY * vX)); fn.Normalize(); 在计算顶点周围的每个面的法线之后,我将所有面法线添加到顶点法线并对其进行标准化。 结果显示在图片中,正如您在背景和网格本身中看到的那样,只要没有不同的细分级别,它就会起作用。 一些更多的代码 /// […]

C#中高效的AABB /三角交叉

任何人都可以推荐任何公共AABB /三角交叉算法的CSharp高效端口。 我一直在看Moller的方法, 在这里抽象地描述,如果我要移植它,我可能会从这个C ++版本开始 。 Mike Vandelay的这个C ++库似乎也是一个很好的起点。 ……或者……任何其他“轮子”可以采用Vector3的三角形并告诉我它是否与AABB相交,相对有效。 似乎有各种各样的算法,但大多数似乎是用c ++编写的,或者只是在白皮书中抽象地描述,我需要针对我们的应用程序的ac#特定实现。 效率不是关键,但c#是。 (虽然效率当然也很好; p) 任何C#选项,在我通过“数学”端口之前;)将不胜感激! 谢谢。

RenderTargetBitmap和Viewport3D – 质量问题

我想将一个3D场景从Viewport3D导出到位图。 显而易见的方法是使用RenderTargetBitmap – 但是当我这样做时,导出的位图的质量明显低于屏幕上的图像。 环顾四周,似乎RenderTargetBitmap没有利用硬件渲染。 这意味着渲染在第0层完成。 这意味着没有mip-mapping等,因此降低了导出图像的质量。 有谁知道如何以屏幕质量导出Viewport3D的位图? 澄清 虽然下面给出的示例没有显示这一点,但我最终需要将Viewport3D的位图导出到文件中。 据我所知,唯一的方法是将图像转换为从BitmapSource派生的东西。 下面的Cplotts显示使用RenderTargetBitmap提高导出质量可以改善图像,但由于渲染仍然在软件中完成,因此速度极慢。 有没有办法使用硬件渲染将渲染的3D场景导出到文件? 当然应该可以吗? 你可以看到这个xaml的问题: RenderTargetBitmap! 这段代码: private void Button_Click(object sender, RoutedEventArgs e) { RenderTargetBitmap bmp = new RenderTargetBitmap((int)viewport3D.ActualWidth, (int)viewport3D.ActualHeight, 96, 96, PixelFormats.Default); bmp.Render(viewport3D); rtbImage.Source = bmp; viewport3D.Visibility = Visibility.Collapsed; rtbImage.Visibility = Visibility.Visible; }