缩放模型
repetier-host
// 反回listview中选中的1个模型
public PrintModel SingleSelectedModel
{
get
{
if (listObjects.SelectedItems.Count != 1) return null;
return (PrintModel)listObjects.SelectedItems[0].Tag; //tag是个object对象,即赋值的时候任何类型都可以
}
}
// 更改模型尺寸事件
private void textScaleX_TextChanged(object sender, EventArgs e)
{
PrintModel model = SingleSelectedModel; // 返回选中的模型
if (model == null) return;
float.TryParse(textScaleX.Text, NumberStyles.Float, Main.Gcodeformat, out model.Scale.x);
if (LockAspectRatio)
{
model.Scale.y = model.Scale.z = model.Scale.x;
// 更新模型的尺度缩放参数, 在ThreedModel的Paint()方法中根据尺度进行重绘
textScaleY.Text = model.Scale.y.ToString(Main.Gcodeformat);
// CultureInfo.InvariantCulture.NumberFormat;保证都是一样的数字数据格式
textScaleZ.Text = model.Scale.z.ToString(Main.Gcodeformat);
}
updateSTLState(model); // 检查模型object的状态. 如果其在打印范围外,则开始跳动pulsing
Main.main.threedview.UpdateChanges(); // gl.invalidate()
// 190616 空间状态改变之后,调用自动放置来使其在空间中可见,否则容易飞走
Main.main.threedview.picbox_AutoPlace_Click(null, null);
}
// 绘制模型中的部分语句,太长了只放关键的
#region 将ThreedView中的所有模型依次画出
foreach (ThreeDModel model in view.models)
{
GL.PushMatrix(); // 将模型视图矩阵压入堆栈中保存下来,然后开始画对应的模型 190830
// 模型视图矩阵堆栈最大为32个,Windows平台,有数量限制,超出的话将会报错。
model.AnimationBefore();
// 压入堆栈之后, 将坐标系移动到所画模型的位置
GL.Translate(model.Position.x, model.Position.y, model.Position.z);
// 这几个Position信息,则可以通过STLcomposeer上的位置坐标进行更新;然后在此处重绘
GL.Rotate(model.Rotation.z, Vector3.UnitZ);
// 按照界面更新后的旋转角度进行旋转,
GL.Rotate(model.Rotation.y, Vector3.UnitY);
GL.Rotate(model.Rotation.x, Vector3.UnitX);
GL.Scale(model.Scale.x, model.Scale.y, model.Scale.z);
// 按照界面更新后的尺度信息进行缩放
model.Paint();
// 用ThreeDModel中的抽象方法, 在子类PrintModel中实现.
// 子类重写了父类的方法, 尽管父类指向子类,但是仍然会调用子类的方法。 190830
//model.AnimationAfter(); 190903暂时屏蔽
GL.PopMatrix(); // 将模型视图矩阵弹出堆栈, 恢复原来的坐标系
// 若模型被选中, 则开始画其bbox
if (model.Selected)
{
GL.PushMatrix(); // 压栈
model.AnimationBefore();
Color col = Main.threeDSettings.selectionBox.BackColor;
GL.Material(MaterialFace.FrontAndBack, MaterialParameter.AmbientAndDiffuse, new OpenTK.Graphics.Color4(0, 0, 0, 255));
GL.Material(MaterialFace.Front, MaterialParameter.Emission, new OpenTK.Graphics.Color4(0, 0, 0, 0));
GL.Material(MaterialFace.Front, MaterialParameter.Specular, new float[] { 0.0f, 0.0f, 0.0f, 1.0f });
GL.Material(
MaterialFace.Front,
MaterialParameter.Emission,
new OpenTK.Graphics.Color4(col.R, col.G, col.B, col.A));
// 190813 画模型的bbox, 更新模型的bbox,只需要更新x/y/zMin, x/y/zMax的值就可以
// drawModel在gl_paint() 中是持续调用的
GL.Enable(EnableCap.LineSmooth);
GL.LineWidth(5);
GL.Begin(BeginMode.Lines); // 一个bbox, 一共12根线
//若开启线的反走样glEnable(GL_LINE_SMOOTH); 设置小数值才起作用,否则就四舍五入的处理整数了。
#region 画模型的bbox
// #1
GL.Vertex3(model.xMin, model.yMin, model.zMin); // 起点
GL.Vertex3(model.xMax, model.yMin, model.zMin); // 终点
// #2
GL.Vertex3(model.xMin, model.yMin, model.zMin);
GL.Vertex3(model.xMin, model.yMax, model.zMin);
// #3
GL.Vertex3(model.xMin, model.yMin, model.zMin);
GL.Vertex3(model.xMin, model.yMin, model.zMax);
// #4
GL.Vertex3(model.xMax, model.yMax, model.zMax);
GL.Vertex3(model.xMin, model.yMax, model.zMax);
// #5
GL.Vertex3(model.xMax, model.yMax, model.zMax);
GL.Vertex3(model.xMax, model.yMin, model.zMax);
// #6
GL.Vertex3(model.xMax, model.yMax, model.zMax);
GL.Vertex3(model.xMax, model.yMax, model.zMin);
// #7
GL.Vertex3(model.xMin, model.yMax, model.zMax);
GL.Vertex3(model.xMin, model.yMax, model.zMin);
// #8
GL.Vertex3(model.xMin, model.yMax, model.zMax);
GL.Vertex3(model.xMin, model.yMin, model.zMax);
// #9
GL.Vertex3(model.xMax, model.yMax, model.zMin);
GL.Vertex3(model.xMax, model.yMin, model.zMin);
// #10
GL.Vertex3(model.xMax, model.yMax, model.zMin);
GL.Vertex3(model.xMin, model.yMax, model.zMin);
// #11
GL.Vertex3(model.xMax, model.yMin, model.zMax);
GL.Vertex3(model.xMin, model.yMin, model.zMax);
// #12
GL.Vertex3(model.xMax, model.yMin, model.zMax);
GL.Vertex3(model.xMax, model.yMin, model.zMin);
#endregion
GL.End();
model.AnimationAfter();
GL.PopMatrix(); // 出栈
}
}
#endregion
查找包围框(bounding box)顶点位置
三维模型最大和最小的2个极值点,可以构成一个包围框。