如何使用ILPlotCube对象可视化XY,XZ和YZ平面视图?

时间:2014-06-15 16:28:54

标签: rotation orientation ilnumerics

我正在使用一个c#应用程序,它使用一个ilpanel来显示一个3d IL组的ILTriangles。我试图设置三个按钮,每个按钮都应修改ilplotcube方向,以显示x-y平面视图,x-z平面视图和y-z视图。

在创建ILPlotcube时,我使用

设置默认的3D(等轴测图)视图
pc.Rotation = Matrix4.Rotation(new Vector3(0.5299, 0.2195, 0.8192), 0.9363);

其中pc是对ILPlotCube对象的引用。如果我然后使用鼠标旋转视图,那会改变什么,相机或立方体?我无法找到如何获得"飞机"从ILPlotCube方向的任意位置查看XY(或XZ或YZ)。我应该如何设置ILPlotCube方向矩阵以实现此结果?

编辑:更清楚:如果将旋转矩阵设置为标识,只有在我没有使用鼠标旋转立方体之前,它才能工作。如果我使用鼠标,它似乎创建了一种克隆立方体,其旋转矩阵等于标识一,但它仍然可视化旋转的视图。

1 个答案:

答案 0 :(得分:0)

用于渲染每个面板/驱动程序创建场景的同步副本。鼠标交互仅操作同步副本。该副本应该用于手动设置绘图立方体的方向。

private void button1_Click(object sender, EventArgs e) {
    //fetch a reference to the SYNCHRONIZED version of the plot cube
    var pc = ilPanel1.SceneSyncRoot.First<ILPlotCube>();

    // modify the plot cube rotation on the synched copy!
    // several example views - choose yours! 
    pc.Rotation = Matrix4.Identity;  // XY - view (default, double click)
    pc.Rotation = Matrix4.Rotation(new Vector3(1, 0, 0), Math.PI * 0.5);  // ZX - view
    pc.Rotation = Matrix4.Rotation(new Vector3(0, 1, 0), Math.PI * 0.5)
                            .Rotate(new Vector3(1, 0, 0), Math.PI * 0.5); // XZ - view 
    pc.Rotation = Matrix4.Rotation(new Vector3(0, 1, 0), Math.PI * 0.5);  // ZY - view
    ilPanel1.Refresh(); 
}

如果没有绘制草图,我真的无法正确地获得这些旋转的方向。如果视图正确,您将检查自己,并防止从错误的一侧/从后面看!

此外,不要与ILCamera.RotateX()ILCamera.RotateY()ILCamera.RotateZ()混淆!它们也可用于绘图立方体,因为ILCamera是绘图立方体的基类。做类似的事情,但通过添加一个新的旋转到现有的旋转工作,这可能不是,你想要的:

// pc.Rotate?(..) rotates the camera iteratively
pc.RotateZ(Math.PI * 0.5);  // <- this is another thing! Use pc.Rotation instead!