gpt4 book ai didi

java - 如何在2D平面上投影3D?

转载 作者:行者123 更新时间:2023-12-01 11:28:52 26 4
gpt4 key购买 nike

我创建了一个简单的应用程序,旨在以 2D 形式显示假设在 3D 平面上的点(这些点的类型为 vector ,如下所示)。该类使用相机的 XYZ 坐标和 vector 的 XYZ 坐标,并使用该信息快速将 vector XYZ 坐标转换为 XY 坐标。

这个问题中唯一需要的类是下面给出的 Vector 类。使用的所有其他类都被省略,因为它们本质上是触发鼠标移动并重绘框架。

--我担心的是,当相机移动时, vector 点会跳来跳去,就好像我使用的公式完全不可靠一样。是these公式(在透视投影下找到)完全不正确?这些公式的使用可以在我的 set2D 方法中找到。我是否做了完全错误的事情,跳过了步骤,或者我是否错误地将公式翻译成代码?

谢谢!

import java.awt.Color;
import java.awt.Graphics;


public class Vector
{
private int cX, cY, cZ; //Camera Coordinates
private int aX, aY, aZ; //Object Coordinates

private double bX, bY; //3D to 2D Plane Coordinates

public Vector(int aX, int aY, int aZ, int cX, int cY, int cZ)
{
this.aX = aX;
this.aY = aY;
this.aZ = aZ;

this.cX = cX;
this.cY = cY;
this.cY = cZ;

set2D();
}

//SETS
public void setCameraX(int cX)
{
this.cX = cX;
set2D();
}

public void setCameraY(int cY)
{
this.cY = cY;
set2D();
}

public void setCameraZ(int cZ)
{
this.cZ = cZ;
set2D();
}

public void setCameraXYZ(int cX, int cY, int cZ)
{
setCameraX(cX);
setCameraY(cY);
setCameraZ(cZ);
}

public void setObjX(int x)
{
this.aX = x;
}

public void setObjY(int y)
{
this.aY = y;
}

public void setObjZ(int z)
{
this.aZ = z;
}

public void setObjXYZ(int x, int y, int z)
{
this.aX = x;
this.aY = y;
this.aZ = z;
}

public void set2D()
{
//---
//the viewer's position relative to the display surface which goes through point C representing the camera.
double eX = aX - cX;
double eY = aY - cY;
double eZ = aZ - cZ;
//----

double cosX = Math.cos(eX);
double cosY = Math.cos(eY);
double cosZ = Math.cos(eZ);

double sinX = Math.sin(eX);
double sinY = Math.sin(eY);
double sinZ = Math.sin(eZ);

//---
//The position of point A with respect to a coordinate system defined by the camera, with origin in C and rotated by Theta with respect to the initial coordinate system.
double dX = ((cosY*sinZ*eY) + (cosY*cosZ*eX)) - (sinY * eZ);
double dY = ((sinX*cosY*eZ) + (sinX*sinY*sinZ*eY) + (sinX*sinY*cosZ*eX)) + ((cosX*cosZ*eY) - (cosX*sinZ*eX));
double dZ = ((cosX*cosY*eZ) + (cosX*sinY*sinZ*eY) + (cosX*sinY*cosZ*eX)) - ((-sinX*cosZ*eY) - (-sinX*sinZ*eX));
//---

//---
//The 2D projection coordinates of the 3D object
bX = (int)(((eZ / dZ) * dX) - eX);
bY = (int)(((eZ / dZ) * dY) - eY);
//---

System.out.println(bX + " " + bY);
}

//GETS
public int getCameraX()
{
return cX;
}

public int getCameraY()
{
return cY;
}

public int getCameraZ()
{
return cZ;
}

public int getObjX()
{
return aX;
}

public int getObjY()
{
return aY;
}

public int getObjZ()
{
return aY;
}

public int get2DX()
{
return (int)bX;
}

public int get2DY()
{
return (int)bY;
}

//DRAW
public void draw(Graphics g)
{
g.setColor(Color.red);
g.fillOval((int)bX, (int)bY, 3, 3);
}

//TO STRING
public String toString()
{
return (aX + " " + aY + " " + aZ);
}
}

最佳答案

以下代码行与您使用的公式不匹配:

double dZ = ((cosX*cosY*eZ) + (cosX*sinY*sinZ*eY) + (cosX*sinY*cosZ*eX)) - ((-sinX*cosZ*eY) - (-sinX*sinZ*eX));

注意部分- ((-sinX*cosZ*eY) - (-sinX*sinZ*eX))

这应该是- ((sinX*cosZ*eY) - (sinX*sinZ*eX))

因为如果你取 sinX 并将其相乘,-ve 符号就会留在外面。但是,如果您使用多个 -sinX,则括号外的符号应变为 +ve。

关于java - 如何在2D平面上投影3D?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30601119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com