【三维模型操作】【4】基本操作

 

缩放模型

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个极值点,可以构成一个包围框。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值