📄 molecule2.java
字号:
if (x>=0)
Angle1=Math.PI+angle1;
else
Angle1=Math.PI+angle1;
}
//
// angle2 调整旋转的角度:
//
// Angle2 是从+Y向Z'旋转的实际角度(范围:0-180度)
// Y Angle2
// ---------------------------------
// +(or 0) angle2 (angle2此时为正)
// - angle2 (angle2此时为负)
if (y>=0)
Angle2=angle2;
else
Angle2=angle2;
Transform3D rot1 = new Transform3D();
Transform3D rot2 = new Transform3D();
rot1.rotY(Angle1);
rot2.rotX(Angle2);
Transform3D newTransform = new Transform3D();
newTransform.mul(rot1);
newTransform.mul(rot2);
return newTransform;
}
// 把座标位置转换成显示位置
private Group createLinks()
{
initLinks();
group=new Group();
shared = new SharedGroup();
shared.addChild(aMolecule());
pointTransform3D = new Transform3D[numLinks][];
pointTransformGroup = new TransformGroup[numLinks][];
for (int l=0; l<numLinks; l++)
{
pointTransform3D[l]=new Transform3D[links[l].numVerts];
pointTransformGroup[l]=new TransformGroup[links[l].numVerts];
for (int i=0;i<links[l].numVerts; i++)
{
pointTransform3D[l][i]=new Transform3D();
pointTransform3D[l][i].setTranslation(new Vector3d(-100,-100,-100));
pointTransformGroup[l][i] = new TransformGroup(pointTransform3D[l][i]);
pointTransformGroup[l][i].setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
pointTransformGroup[l][i].addChild(new Link(shared));
group.addChild(pointTransformGroup[l][i]);
}
}
return group;
}
private void moleculeActivate()
{
if (readAScene()==true) // 如果读不到数据就不更新
{
for (int l=0; l<numLinks; l++)
{
for (int i=0;i<links[l].numVerts; i++)
{
if (i==links[l].numVerts-1)
{
pointTransform3D[l][i] = transForm(
pointPosition[l][i-1].x - pointPosition[l][i].x,
pointPosition[l][i-1].y - pointPosition[l][i].y,
pointPosition[l][i-1].z - pointPosition[l][i].z
);
} else
{
pointTransform3D[l][i] = transForm(
pointPosition[l][i+1].x - pointPosition[l][i].x,
pointPosition[l][i+1].y - pointPosition[l][i].y,
pointPosition[l][i+1].z - pointPosition[l][i].z
);
}
pointTransform3D[l][i].setTranslation(new Vector3d(pointPosition[l][i].x, pointPosition[l][i].y, pointPosition[l][i].z));
pointTransformGroup[l][i].setTransform( pointTransform3D[l][i] );
}
}
}
}
public BranchGroup createSceneGraph(Canvas3D c) {
BranchGroup objRoot = new BranchGroup();
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
// 顶板和底板颜色及材质
Appearance ap0 = new Appearance();
Material mat0 = new Material();
mat0.setDiffuseColor(new Color3f(1f,.0f,0f));
ap0.setMaterial(mat0);
// 上下垂直坐标轴的颜色及材质
Appearance ap2 = new Appearance();
Material mat2 = new Material();
mat2.setDiffuseColor(new Color3f(0/255f,0/255f,180/255f));
ap2.setMaterial(mat2);
// 左右水平标轴的颜色及材质
Appearance ap3 = new Appearance();
Material mat3 = new Material();
mat3.setDiffuseColor(new Color3f(0/255f,0/255f,125/255f));
ap3.setMaterial(mat3);
// 垂直屏幕的坐标轴的颜色及材质
Appearance ap4 = new Appearance();
Material mat4 = new Material();
mat4.setDiffuseColor(new Color3f(0/255f,0/255f,125/255f));
ap4.setMaterial(mat4);
// 背景
Color3f bgColor = new Color3f(0/255f, 0/255f, 0/255f);
Background bg = new Background(bgColor);
bg.setApplicationBounds(bounds);
objRoot.addChild(bg);
// 灯光
// Set up the global lights
Color3f lColor1 = new Color3f(1f, 1f, 1f);
Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
lgt1.setInfluencingBounds(bounds);
objRoot.addChild(lgt1);
Color3f DirectionalColor = new Color3f(1.f, 1.f, 1.f);
Vector3f vec = new Vector3f( 0.f, 1.f, -1.0f );
DirectionalLight DirectionalLight= new DirectionalLight(DirectionalColor,vec);
DirectionalLight.setInfluencingBounds(bounds);
objRoot.addChild(DirectionalLight);
globalTransform3D = new Transform3D();
globalTransform3D.rotX(0.3);
globalTransform3DBackup=new Transform3D(globalTransform3D);
globalTransformGroup = new TransformGroup(globalTransform3D);
globalTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
globalTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objRoot.addChild(globalTransformGroup);
float size=1.5f;
float size2=size-0.3f;
// 顶板
Transform3D t = new Transform3D();
t.setTranslation(new Vector3f(0f,size,0f));
TransformGroup gb1 = new TransformGroup(t);
Box box = new Box(size,0.02f,size2,ap0);
gb1.addChild(box);
globalTransformGroup.addChild(gb1);
// 底板
t = new Transform3D();
t.setTranslation(new Vector3f(0f,-size,0f));
TransformGroup gb2 = new TransformGroup(t);
box = new Box(size,0.02f,size2,ap0);
gb2.addChild(box);
globalTransformGroup.addChild(gb2);
// 中心垂直轴
globalTransformGroup.addChild(new Cylinder(0.03f, 2*size-0.04f, ap2));
// 从左到右坐标轴
t = new Transform3D();
t.rotZ(Math.PI/2);
TransformGroup gb3 = new TransformGroup(t);
gb3.addChild(new Cylinder(0.03f, 2*size, ap3));
globalTransformGroup.addChild(gb3);
t = new Transform3D();
t.rotZ(-Math.PI/2);
t.setTranslation(new Vector3f(size,0f,0f));
TransformGroup gb4 = new TransformGroup(t);
gb4.addChild(new Cone(0.05f, 0.3f, Primitive.GENERATE_NORMALS, ap3));
globalTransformGroup.addChild(gb4);
// 从内到外坐标轴
t = new Transform3D();
t.rotX(Math.PI/2);
TransformGroup gb5 = new TransformGroup(t);
gb5.addChild(new Cylinder(0.03f, 2*size, ap4));
globalTransformGroup.addChild(gb5);
t = new Transform3D();
t.rotX(Math.PI/2);
t.setTranslation(new Vector3f(0f,0f,size));
TransformGroup gb6 = new TransformGroup(t);
gb6.addChild(new Cone(0.05f, 0.3f, Primitive.GENERATE_NORMALS, ap4));
globalTransformGroup.addChild(gb6);
globalTransformGroup.addChild(createLinks());
MouseRotate behavior = new MouseRotate();
behavior.setTransformGroup(globalTransformGroup);
behavior.setSchedulingBounds(bounds);
objRoot.addChild(behavior);
MouseZoom behavior2 = new MouseZoom();
behavior2.setTransformGroup(globalTransformGroup);
behavior2.setSchedulingBounds(bounds);
objRoot.addChild(behavior2);
MouseTranslate behavior3 = new MouseTranslate();
behavior3.setTransformGroup(globalTransformGroup);
behavior3.setSchedulingBounds(bounds);
objRoot.addChild(behavior3);
KeyNavigatorBehavior key=new KeyNavigatorBehavior(globalTransformGroup);
key.setSchedulingBounds(bounds);
objRoot.addChild(key);
objRoot.compile();
return objRoot;
}
Group aMolecule(){
// 分子小球颜色及材质
Appearance ap11 = new Appearance();
Material mat11 = new Material();
mat11.setDiffuseColor(new Color3f(1f,0.65f,1f));
ap11.setMaterial(mat11);
// 分子杆
Appearance ap12 = new Appearance();
Material mat12 = new Material();
mat12.setDiffuseColor(new Color3f(1f,0.65f,1f));
ap12.setMaterial(mat12);
Group group = new Group();
Transform3D t1 = new Transform3D();
TransformGroup g1 = new TransformGroup(t1);
g1.addChild(new Sphere(radius*(0.08f/0.2f),ap11));
t1=new Transform3D();
t1.setTranslation(new Vector3f(0f,0.14f,0f));
TransformGroup g2 = new TransformGroup(t1);
g2.addChild(new Cylinder(0.03f,radius*(0.12f/0.2f)+0.1f,ap11));
group.addChild(g1);
group.addChild(g2);
return group;
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == activateB){
if (activateState)
{
stop();
activateState=false;
} else
{
start();
activateState=true;
}
}
if (e.getSource() == normalB){
globalTransform3D.set(globalTransform3DBackup);
globalTransformGroup.setTransform(globalTransform3D);
}
if (e.getSource() == rotateBX){
angle += Math.toRadians(-15.0);
globalTransform3D.rotX(angle);
globalTransformGroup.setTransform(globalTransform3D);
}
if (e.getSource() == rotateBY){
angle += Math.toRadians(30.0);
globalTransform3D.rotY(angle);
globalTransformGroup.setTransform(globalTransform3D);
}
if (e.getSource() == rotateBZ){
angle += Math.toRadians(30.0);
globalTransform3D.rotZ(angle);
globalTransformGroup.setTransform(globalTransform3D);
}
}
public void start() {
timerFlag=true;
timer = new Thread(this);
timer.start();
}
public void stop() {
timerFlag=false;
timer.interrupt();
timer = null;
}
public void run() {
while (timer != null && timerFlag) {
try{
if (timerFlag) moleculeActivate();
Thread.sleep(1000);
} catch (InterruptedException e) {return;}
}
}
public molecule2() {
setLayout(new BorderLayout());
Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
add("Center", c);
Panel p = new Panel();
p.add(activateB);
p.add(normalB);
p.add(rotateBX);
p.add(rotateBY);
p.add(rotateBZ);
add("South", p);
activateB.addActionListener(this);
normalB.addActionListener(this);
rotateBX.addActionListener(this);
rotateBY.addActionListener(this);
rotateBZ.addActionListener(this);
Viewer viewer = new Viewer(c);
Vector3d viewpoint = new Vector3d(0.0, 0.0, 7.3); //初始观察点位置
Transform3D t = new Transform3D();
t.set(viewpoint);
ViewingPlatform v = new ViewingPlatform( );
v.getViewPlatformTransform().setTransform(t);
BranchGroup scene = createSceneGraph(c);
SimpleUniverse u = new SimpleUniverse(v, viewer);
u.getViewingPlatform();
u.addBranchGraph(scene);
}
public static void main(String[] args) {
new MainFrame(new molecule2(), 800, 540);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -