[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);
    }
}