如何通过按C#中的按钮来缩放立方体?

时间:2011-11-24 13:49:09

标签: c# 3d cube

我有一个打印立方体的程序,可以旋转。这是代码。

public partial class ProjectorForm : Form
{
    Projector projector;
    Cube cube;
    float deltaRot;           



    public ProjectorForm()
    {            
        InitializeComponent();

    }

    private void ProjectorForm_Load(object sender, EventArgs e)
    {

        deltaRot = 0.01f;

        projector = new Projector();
        cube = new Cube(Vector3.UnitZ * 20*10, 10*10, 10*10, 15*10);

        updateTimer.Start();
    }

    private void updateTimer_Tick(object sender, EventArgs e)
    {
        if (rotXBox.Checked)
            cube.RotateX(deltaRot);
        if (rotYBox.Checked)
            cube.RotateY(deltaRot);
        if (rotZBox.Checked)
            cube.RotateZ(deltaRot);



        doubleBufferedPanel1.Invalidate();
    }



    private void doubleBufferedPanel1_Paint(object sender, PaintEventArgs e)
    {

        e.Graphics.Clear(Color.White);
        cube.Draw(projector, Color.Black, doubleBufferedPanel1.ClientSize.Width, doubleBufferedPanel1.ClientSize.Height, e.Graphics);


    }

    private void button1_Click(object sender, EventArgs e)
    {
        deltaRot = float.Parse(deltaRotBox.Text);
    }




}

class Projector
{
    public Vector3 cameraPosition;
    public float planeDistance;
    ProjectorForm n = new ProjectorForm();





    public Projector()
    {
        cameraPosition = Vector3.Zero;
        planeDistance = 256; //Here, multiply by 2 and the scaled cube, how to make that scale when you press the button.

    }

    public PointF Project(Vector3 point, float width, float height)
    {
        float x = cameraPosition.X + ((cameraPosition.Z + planeDistance) / (point.Z - cameraPosition.Z)) * (point.X - cameraPosition.X) + width / 2;
        float y = cameraPosition.Y + ((cameraPosition.Z + planeDistance) / (point.Z - cameraPosition.Z)) * (point.Y - cameraPosition.Y) + height / 2;
        return new PointF(x, y);
    }

    public void DrawLine(Color color, Vector3 p1, Vector3 p2, float width, float height, Graphics g)
    {
        g.DrawLine(new Pen(color), Project(p1, width, height), Project(p2, width, height));
    }

    public void FillPolygon(Color color, Vector3[] vertices, float width, float height, Graphics g)
    {
        PointF[] points = new PointF[vertices.Length];
        for (int i = 0; i < points.Length; i++)
            points[i] = Project(vertices[i], width, height);
        g.FillPolygon(new SolidBrush(color), points);
    }
}

如何制作立方体可以通过按下按钮进行缩放。我在类Projector中找到了变量planeDistance,当它增加2倍时,立方体被缩放,但我不知道如何通过按钮增加它。

1 个答案:

答案 0 :(得分:1)

字段planeDistance是公开的,因此您可以在课外进行更改。即只需将以下内容添加到按钮的事件处理程序中:

projector.planeDistance += 10; // Change 10 as appropriate

值得注意的是,这不会改变立方体的大小,它会改变相机离它的距离。因此,虽然立方体的大小似乎在变化,但这只是因为相机移近/远离。


要实际更改多维数据集的大小,您必须更改cube类中的字段。 由于大小是由构造函数中创建的向量定义的,所以在创建多维数据集后,您实际上并没有简单的方法来更改它们。

  1. 每当您想要更改大小时,您都可以创建一个新的多维数据集(跟踪表单上另一个变量的大小)。
  2. 您可以向多维数据集类添加一个方法,该方法创建定义新大小的新向量(它看起来有点像构造函数,只填充数组,而不是创建它们。)
  3. 您可以为您的多维数据集添加一个大小字段,始终创建一个单位多维数据集(1,1,1),然后在渲染时将每个向量乘以您的大小。