Sum*_*din 7 java 3d java-3d rotation
下面的代码将一个多维数据集放在(0,0,0),另一个放在(0,.5,.5),每个多维数据集的维度为(.5,.5,.5).我正在尝试旋转屏幕到达这样的视图
但我得到了这个观点
.而且,我意识到我的颜色向后倾斜.
无论如何,这是我的代码到目前为止:
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class Positioning {
private Color3f lightBlue;
private Color3f aquaGreen;
private Color3f white;
private Color3f teal;
private BranchGroup group;
private SimpleUniverse universe;
public Positioning() {
lightBlue = new Color3f(0.0f, 0.749019608f, 1.0f);
aquaGreen = new Color3f(0.439215686f, 0.858823529f, 0.576470588f);
white = new Color3f(1.0f, 1.0f, 1.0f);
teal = new Color3f(0.196078431f, 0.6f, 0.8f);
universe = new SimpleUniverse();
group = new BranchGroup();
addCube(0.5f, 0.5f, 0.5f, new Vector3f(0.0f, 0.0f, 0.0f), lightBlue);
addCube(0.5f, 0.5f, 0.5f, new Vector3f(0.5f, 0.0f, 0.5f), aquaGreen);
//add light
DirectionalLight light1 = new DirectionalLight(white, new Vector3f(0.0f, 7.0f, -12.0f));
light1.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0));
group.addChild(light1);
//look at the right spot
Transform3D lookAt = new Transform3D();
lookAt.lookAt(new Point3d(0.0, 0.0, 3.0), new Point3d(0.0, 0.0, 0.0), new Vector3d(1.0, 1.0, 0.0));
lookAt.invert();
universe.getViewingPlatform().getViewPlatformTransform().setTransform(lookAt);
universe.addBranchGraph(group);
}
public void addCube(float x, float y, float z, Vector3f position, Color3f color) {
TransformGroup tg = new TransformGroup();
Transform3D trans = new Transform3D();
Appearance app = new Appearance();
Material mat = new Material();
mat.setDiffuseColor(color);
mat.setSpecularColor(color);
app.setMaterial(mat);
Box b = new Box(x, y, z, app);
//move into position and add to the branch group
trans.setTranslation(position);
tg.setTransform(trans);
tg.addChild(b);
group.addChild(tg);
}
public static void main(String[] args) {
new Positioning();
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在画布是黑色的,我认为它可能是我在lookAt函数上的定位.我也不确定向上矢量是什么.有想法该怎么解决这个吗?
我不熟悉 Java,但通常您可以使用某种“lookAt”函数设置视图矩阵。快速浏览一下文档就想到了这个。
顺便说一句,setNominalViewingTransform仅沿 z 轴平移,因此您显示的屏幕截图正是我希望看到的。您尝试自己设置视图转换是正确的。
编辑
lookAt就该功能的向上方向而言,这只是控制相机滚动的一种方式。换句话说,通过指定眼点和中心点(相机正在观察的点),您只定义了一个方向。相机仍然可以在该轴上旋转 360 度。如果您想以正确的方式看待事物,那么只需在您的系统中指定一个“向上”方向的向量 - 如果那是 y 那么它将是 (0,1,0)。如果你想倒过来看,那就是 (0,-1,0)。
请注意,您不必确保“向上”向量与眼睛和中心定义的方向垂直。只要它不平行于该方向,那么该方法应该自动使用您提供的“向上”向量的垂直于该方向的分量。
编辑2:
根据您的编辑,您似乎已经为“向上”向量而不是方向设置了位置。它应该只是向量 (0,1,0)。话虽如此,它仍然无法解决您的问题,因为不正确的“向上”矢量只是意味着相机可能最终会绕其自己的轴滚动,从而使其倒置、侧放等,但它不会。 t 影响方向。
因此,眼睛和中心位置一定有问题,否则矩阵仍然没有反转。你对invert()外观的编辑是错误的,因为你没有在你的上调用它,lookAt Transform3D但我认为这只是一个错字。你什么时候更新的问题?
我会尝试一个更简单的视角开始。试着用类似的东西沿着 z 轴看
Transform3D lookAt = new Transform3D();
lookAt.lookAt( new Point3d( 0.0, 0.0, 1.0 )
, new Point3d( 0.0, 0.0, 0.0 )
, new Vector3d( 0.0, 1.0, 0.0) );
lookAt.invert();
Run Code Online (Sandbox Code Playgroud)
那会发生什么?
如果仍然变黑,请尝试沿 z 轴更改眼点的位置,也许尝试 2.0、3.0 和一些负值。
另一种可能性是您的相机正朝着正确的方向看,但由于截锥体裁剪,对象正在被剔除。您可能需要查看文档以了解默认剪裁平面的设置。当您沿 z 轴更改眼睛位置时,这可能会显示在上面的示例中。如果您可以看到您的对象的某些 z 值而不是其他值,那么这可能是一个裁剪问题。
让我知道你是怎么办的。