[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Java3Djp:00608] Re: LineTest.java
/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
やっと自宅で【エイズ検査】が可能に!。●不能治療薬もあります。
血液による「簡易エイズ検査キット」5000円(輸入品)
[USメディカル] click→http://www.usa-medical.com←click here!!
/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
岸田です。
ENDO Yasuyuki wrote:
> >このようにしてみたら、画面を移動した後はキャンバスとの対応がとれな
> >くなってしまうんですね。#あたりまえかな。
> >そのあたりをうまくやるためにはどうすればいいのでしょうか。
>
> 私もまだよく理解していないのですが、
> Sun の Java 3D のメーリングリストでもこの問題は FAQ になっているようです。
>
> http://java.sun.com/products/java-media/mail-archive/3D/1960.html
>
> ここ↑にサンプル・コードがあるようなので研究してみようと思います。
>
> 問題点としては、
>
> http://java.sun.com/products/java-media/mail-archive/3D/2255.html
>
> >The VworldToImagePlate transform goes between the virtual world (Vworld) and
> >the physical world (image plate), but does not include the perspective
> >projection.
>
> だそうです。
>
> # ビューモデルがよく分からない...
> --
上記のような問題でもなかったようでした。
勝手にKeyNavigator で物体を動かしてしまったので、その分の変換を
戻してGeometry に Point3D を設定してあげなければいけなかったです。
説明の仕方がうまくないのでプログラムを載せておきます。
プログラムをだいぶ変更してしまいました。
BranchGroup をつけたりはずしたりするのはやめました。参考にしてく
ださい。
// LineTest1.java
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.behaviors.keyboard.KeyNavigatorBehavior;
public class LineTest1 extends Applet {
public final int MAX_VERTICES = 50;
public int vertexCount = 0;
public Point3d[] vertices = new Point3d[MAX_VERTICES];
boolean debug = true;
Shape3D shape;
TransformGroup objTrans;
public LineTest1() {
setLayout(new BorderLayout());
Canvas3D canvas = new Canvas3D(null);
add(canvas, BorderLayout.CENTER);
SimpleUniverse universe = new SimpleUniverse(canvas);
universe.getViewingPlatform().setNominalViewingTransform();
canvas.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e ) {
addPoint((Canvas3D) e.getSource(), e.getX(), e.getY());
}
});
BranchGroup scene = createSceneGraph();
universe.addBranchGraph(scene);
}
private BranchGroup createSceneGraph() {
BranchGroup objRoot = new BranchGroup();
objRoot.setCapability(Node.ALLOW_LOCAL_TO_VWORLD_READ);
objTrans = new TransformGroup();
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
BoundingSphere bounds =
new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
KeyNavigatorBehavior behavior =
new KeyNavigatorBehavior(objTrans);
objTrans.addChild(behavior);
behavior.setSchedulingBounds(bounds);
objRoot.addChild(objTrans);
for (int i = 0; i < vertices.length; i++) {
vertices[i] = new Point3d();
}
shape = new Shape3D();
shape.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
shape.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
objTrans.addChild(shape);
objRoot.compile();
return objRoot;
}
public void addPoint(Canvas3D canvas, int xpos, int ypos) {
if (++vertexCount > MAX_VERTICES) vertexCount = MAX_VERTICES;
Transform3D imagePlateToVworld = new Transform3D();
Point3d mousePosn = new Point3d();
canvas.getPixelLocationInImagePlate(xpos, ypos, mousePosn);
canvas.getImagePlateToVworld(imagePlateToVworld);
imagePlateToVworld.transform(mousePosn);
Transform3D transform = new Transform3D();
objTrans.getTransform(transform);
transform.invert();
transform.transform(mousePosn);
vertices[vertexCount - 1].x = mousePosn.x;
vertices[vertexCount - 1].y = mousePosn.y;
vertices[vertexCount - 1].z = mousePosn.z;
if (vertexCount > 1) {
Point3d[] subVertices = new Point3d[vertexCount];
int[] stripVertexCounts = {vertexCount};
for (int i = 0;i < vertexCount; i++) {
subVertices[i] = vertices[i];
}
LineStripArray geometry =
new LineStripArray(vertexCount,
GeometryArray.COORDINATES,
stripVertexCounts);
geometry.setCoordinates(0, subVertices);
shape.setGeometry(geometry);
}
}
public static void main(String[] args) {
new MainFrame(new LineTest(), 500, 500);
}
}