我正在尝试在wpf中绘制一条3D线,我有这个xaml代码:
<Grid>
<Viewport3D x:Name="ViewerViewport"
RenderOptions.BitmapScalingMode="HighQuality"
Focusable="True" Grid.RowSpan="2">
<ModelVisual3D x:Name="Model">
</ModelVisual3D>
<!-- Camera -->
<Viewport3D.Camera>
<PerspectiveCamera x:Name="Camera"
Position="0,0,0"
LookDirection="0,1,0"
UpDirection="0,0,1"
FieldOfView="100"
FarPlaneDistance="10"
NearPlaneDistance="0.1"/>
</Viewport3D.Camera>
</Viewport3D>
</Grid>
和这个c#代码:
public MainWindow()
{
InitializeComponent();
var ModelsGroup = new Model3DGroup();
ModelsGroup.Children.Add(this.AddLine(new Point3D(0, 0, 100), new Point3D(0, 100, 100),"line 1)"));
ModelsGroup.Children.Add(new AmbientLight(Colors.White));
Model.Content = ModelsGroup;
}
和行创建代码:
private Model3D AddLine(Point3D startPoint, Point3D EndPoint, string name)
{
SolidColorBrush brush = new SolidColorBrush(Colors.Black);
var material = new DiffuseMaterial(brush);
var mesh = new MeshGeometry3D();
mesh.Positions.Add(startPoint);
mesh.Positions.Add(EndPoint);
mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(0);
return new GeometryModel3D(mesh, material);
}
但它没有显示输出中的任何一行?
这有什么问题?
我知道有一些3d库可以很容易地做到这一点,但我想学习如何在WPF中完成它,然后研究如何使用库(如helix3d)
答案 0 :(得分:3)
您正在创建一个三角形,其中两个角位于同一点,即一个零区域的三角形,因此无法从任何角度看到它。 WPF仅使用面积为
的三角形要创建线条,您必须在线条的长度和宽度上创建一个矩形,然后用对角线分割它以创建两个窄三角形。所以你需要四个位置和两个三角形,比如“0 1 2 0 1 3”。当然,你必须确保这个矩形的方向是朝向相机。
你可以google或bing for helix toolbox,这是一个很棒的WPF实用工具库。在那里你可能会找到一个有用的辅助函数。
答案 1 :(得分:1)
为什么你想画线。在3D中,您通常需要三角形。如果您有三角形,则可以确定normals
。它们用于定义三角形的面,用于照明和纹理。
相机设置
典型的相机Position
位于正z坐标(类似于0,0,2或5,0,20)的某处,LookDirection
向量为0,0,-1和UpDirection
向量为0,1,0。在这种情况下,轴应按原样定位(正y轴向上,正x轴向右)。
如果将UpDirection
更改为1,0,0,则正x轴上升而不是y轴
如果您将Position
更改为负z坐标(0,0,-5)并将LookDirection
更改为0,0,1,那么您可以查看&#34;背后&#34;因此正x轴向左(不是向右),但y轴仍然向上。
在您的设置中,相机指向原点的正y数字,z轴向上。 X轴仍然向右移动。如果我在你的代码中添加第三个点。点100,0,100,比你可以看到小的黑色三角形。
mesh.Positions.Add(startPoint);
mesh.Positions.Add(endPoint);
mesh.Positions.Add(new Point3D(100, 0, 100));
mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(2);
这个三角形很小,因为距离相机的距离是100.所以@Samuels在评论中说设置中的另一个错误是FarPlaneDistance="10"
。
答案 2 :(得分:0)
你构建没有厚度的线......实际上这和像素着色是WPF最重要的两个问题.... 如果你想绘制线条,你必须将其构建为四边形(2个连接三角形),如果你想变得更聪明并且三角形数量更少,你可以使用其他技巧(我会让你想想它^^,但对于给定的网格,你可以有一个与网格具有完全相同数量的三角形的线框,如果你创建四边形则不是这种情况)