关于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)。
增加比例因子。
不要忘记在处理程序末尾取消事件处理。