觉得这里比较安静!
记录一下平时的学习和生活吧!
最近在学习java3D,本来就对java很感兴趣,虽然没学多少呢,但是确实感觉到它是一门伟大的语言了,哈哈。
这周是java的课程设计,选择的题目是制作一个3D效果的单摆动画,其实本来是准备做一个超级简单的旋转的小球来的,但是后来同学要和我一起做,就说做个稍微复杂一点的就做那个单摆了,不过对于初学者来说还真是有点复杂,我们现在已经想好怎么做了但是有点看似应该的东西偏偏按照不应该的方向发展,所以今天晚上得弄点东西了。
先从最简单的开始(其实刚看的时候,完全没有接触过叫j3d的东西,一片茫然,还好看了几天了,了解了一些基本的东西了)
首先:在屏幕上显示一个球还有一条直线:
//画直线的方法,类型是Shape3D,返回一个Shape3D对象
public static Shape3D pendulumLine() {
float vert[] = {
0f, 0.8f, 0.0f,
0f, -0.8f, 0.0f
};
float color[] = {
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f
};
LineArray line = new LineArray(2, LineArray.COORDINATES | LineArray.COLOR_3);
line.setCoordinate(0, vert);
line.setColor(0, color);
LineAttributes pa = new LineAttributes();
pa.setLineWidth(2.5f);
pa.setLineAntialiasingEnable(true);
pa.setLinePattern(LineAttributes.PATTERN_SOLID);
Appearance app = new Appearance();
app.setLineAttributes(pa);
Shape3D shape = new Shape3D();
shape.setGeometry(line);
shape.setAppearance(app);
Color3f col = new Color3f(1.0f, 1.0f, 1.0f);
Background bg = new Background(col);
return shape;
}
设为静态的方法,可以通过类的直接调用在单摆摆动的时候在任意相应的空间坐标处画直线的断点坐标(其中
有一个端点的坐标作为摆动的轴是固定的)。
然后是画球,这个在方法creatSceneGraph()中
public BranchGroup createSceneGraph() { BranchGroup objRoot = new BranchGroup(); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 400.0); DirectionalLight LB = new DirectionalLight(); LB.setInfluencingBounds(bounds); objRoot.addChild(LB); Transform3D TG0 = new Transform3D(); TG0.setTranslation(new Vector3f(0.8f, 0.0f, 0f)); TransformGroup trans = new TransformGroup(TG0); trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); Appearance ap = new Appearance(); Material ma = new Material(); ma.setDiffuseColor(new Color3f(1.0f, 1.0f, 1.0f)); ap.setMaterial(ma); Sphere object = new Sphere(0.2f, Sphere.GENERATE_NORMALS, ap); objRoot.addChild(trans); trans.addChild(object); objRoot.addChild(pendulumLine()); Color3f col1 = new Color3f(0.0f, 0.0f, 0.0f); Background bg = new Background(col1); bg.setApplicationBounds(bounds); objRoot.addChild(bg); objRoot.compile(); return objRoot; }
这里定义了边界、照射的灯光以及球的材质,其中objRoot.addChild(pendulumLine()); 就是调用了画直线的方法。
今天就写到这里,有几个问题没解决,一个是画线一直在整个区域的上半部分,弄了好半天也没明白为什么,还有一
个就是线的颜色问题,越往下似乎有一些黑色夹杂了进去,不过这个效果还不错。
我的表达不太好,等写的多了估计就好了,其实就是一个学习的历程,等回过头来看,可能会感觉很有收获吧。