关于ILNumerics中的ILPanel,我有三个问题:


如何禁用ILPanel的双击交互来重置视图。
如何使用右键单击和拖动来提高平移速度。平移非常慢,尤其是当形状变化很大时。
如何访问添加到相机的元素并进行修改。


这是一个简单的例子。将两个球体添加到摄像机,并且其中一个ILLable“ Hello”位于其中一个球体(蓝色球体)的顶部。如果我用鼠标旋转场景,并且绿色球变得更靠近相机和签证诗句,我希望“ Hello”标签跳到绿色球的顶部。而且,如何通过单击按钮来更改球体的颜色?

 private void ilPanel1_Load(object sender, EventArgs e)
 {
        var scene = new ILScene();
        var cam = scene.Camera;
        var Sphere1 = new ILSphere();
        Sphere1.Wireframe.Visible = true;
        Sphere1.Fill.Color = Color.Blue;
        Sphere1.Wireframe.Color = Color.Blue;
        Sphere1.Transform = Matrix4.Translation(0, 0, 0);
        var Sphere2 = new ILSphere();
        Sphere2.Wireframe.Visible = true;
        Sphere2.Transform = Matrix4.Translation(2, 0, 0);
        cam.Add(Sphere1);
        cam.Add(Sphere2);
        cam.Add(new ILLabel("Hello")
        {
            Font = new System.Drawing.Font(FontFamily.GenericSansSerif, 8),
            Position = new Vector3(0, 0, 1.1),
            Anchor = new PointF(0, 1),
        });
        ilPanel1.Scene = scene;
 }

最佳答案

创建一个标签,该标签始终位于其他3D对象的顶部

cam.Add(
        new ILScreenObject() {
            Location = new PointF(0.5f, 0.5f),
            Children = {
                new ILLabel("Hello")
            }
        });


另请参阅:http://ilnumerics.net/world3d-and-screen2d-nodes.html

关于“跳跃球”示例:如果您希望标签在运行时跳转到另一个组(实际上是球是组),则必须将该逻辑实现为在运行时调用的函数。 ilPanel1.BeginRenderFrame可能是检查此类更新的好地方。

禁用第一个摄像机的默认行为:

scene.Camera.MouseDoubleClick += (_, arg) => {
    arg.Cancel = true;
};


参见:http://ilnumerics.net/mouse-events.html

在按下按钮时做出反应:

button1.Click += (_,args) => {
    ilPanel1.Scene.First<ILSphere>().Fill.Color = Color.Red;
    ilPanel1.Refresh();
};


在场景中查找对象:
参见:http://ilnumerics.net/nodes-accessing-managing.html

控制平移速度:

当前没有简单的方法可以配置速度。最好的方法是自己实现相应的鼠标处理程序:


覆盖相机节点的MouseMove。
实现平移,类似于在ILNumerics中完成平移的方式(请参阅:源代码中的ILCamera.OnMouseMove)。
增加比例因子。
不要忘记在处理程序末尾取消事件处理。

07-28 03:25