[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Java3Djp:01583] Re: 教えてください。



■■■■■■■■■■■■■■ on-D ■■■■■■■■■■■■■■■■■
温泉行きたい!→on-D  ■知って得する■    『25ans』『OZmagazine』
秋の靴欲しい!→on-D  ■情報サイト!■  『anan』『non-no』『ELLE』
髪型変えたい!→on-D  ■メジャー女性誌集合→『JJ』『With』『ViVi』…
■■■■■■■ http://www.on-d.co.jp/mailad/easyml3.html ■■■■■;


井藤といいます。
私も初心者なので、勉強のためにも返事を書きます。


""Akihito Kikuchi" <k-aki@xxxxxxxxxxxxx>"さんは書きました:
> 
> 点からポリゴンを自前で作っていって
> プリミティブのシリンダーとまったく同じもの
> (プリミティブで描画したときの位置や形がまったく同じもの)
> をつくりたいのですが、
> プリミティブを構成しているポリゴンのための点の
> 座標情報を知るにはどうしたらよいのでしょうか。
> 
> 具体的に私が知りたいのは
> 半径0.5、高さ0.5のプリミティブのシリンダー
> 半径0.4、高さ0.4のプリミティブのシリンダー
> 半径0.05、高さ1.0のプリミティブのシリンダー
> 半径0.5、高さ0.05のプリミティブのシリンダー
> 
> をそれぞれ描画したときの
> ポリゴンを実際に作っている全ての点座標を知りたいです。
> 
> どなたか教えていただけませんか。
> 
Cylinder をnew して、その座標を取得しようとしたのですが…、
私もわかりませんでした。
getShapeしてgetGeometry()、TriangleStripArrayに入れてみたり
したのですが、getCoordRef3d() ができませんでした。


com.sun.j3d.utils.geometry.Cylinder
が何をやっているのかは、
java3d-utils-src.jar
の中の
Cylinder.java
と
Quadrics.java
を見ればある程度わかると思います。


「私もわかりませんでした」で終わるのはあれですので、
下にソースコードを載せます。あまり参考にならないかもしれませんが。
# きたなすぎ&恐らく間違っている
シリンダーではないのですが、半径0.5、高さ0.5のただの筒なら、
EccentricCone ec = new EccentricCone(0.5,0.5,1,0.5,0,0);
とかやればできるはずです。
回転して確かめてみてください。

==============================================================================

import java.util.Vector;
import java.util.Enumeration;
import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.picking.*;

/**
* 偏心楕円錐台?
*/
public class EccentricCone extends BranchGroup {

        private int nopts2 = 0;
        private TransformGroup tg;

        /**
        @param  semiAxis1       底部楕円半径 1
        @param  semiAxis2       底部楕円半径 2          
        @param  ratio           底部対上部楕円半径比率
        @param  height          高さ
        @param  axis1offset     偏心 1
        @param  axis2offset     偏心 2
        @param  ap              Appearance for Shape3D
        */
        public EccentricCone(double semiAxis1, double semiAxis2, 
                                                        double ratio, double height, 
                                                        double axis1offset, double axis2offset, 
                                                        Appearance ap) {
                
                int count = 0;
                int DIVNUM = 15;
                double RADINC = 2*Math.PI/DIVNUM;
                
        // 0913 QuadArrayバージョン
                nopts2 = DIVNUM * 4;
                
                Point3d[] vertices2 = new Point3d[ nopts2 ];
                
                for(count = 0; count <DIVNUM; count++) {
                        // 左上
                        double tx1 = ratio * semiAxis1 * Math.cos( RADINC * count ) + axis2offset;
                        double ty1 = ratio * semiAxis2 * Math.sin( RADINC * count ) - axis1offset;
                        double tz1 = height;
                        vertices2[4 * count] = new Point3d( tx1, ty1, tz1 );
                        // 左下
                        double bx1 = semiAxis1 * Math.cos( RADINC * count );
                        double by1 = semiAxis2 * Math.sin( RADINC * count );
                        double bz1 = 0;
                        vertices2[4 * count + 1] = new Point3d( bx1, by1, bz1 );
                        // 右下
                        double bx2 = semiAxis1 * Math.cos( RADINC * (count+1) );
                        double by2 = semiAxis2 * Math.sin( RADINC * (count+1) );
                        double bz2 = 0;
                        vertices2[4 * count + 2] = new Point3d( bx2, by2, bz2 );
                        // 右上
                        double tx2 = ratio * semiAxis1 * Math.cos( RADINC * (count+1) ) + axis2offset;
                        double ty2 = ratio * semiAxis2 * Math.sin( RADINC * (count+1) ) - axis1offset;
                        double tz2 = height;
                        vertices2[4 * count + 3] = new Point3d( tx2, ty2, tz2 );
                }
                
                GeometryInfo ginfo = new GeometryInfo( GeometryInfo.QUAD_ARRAY );
                ginfo.setCoordinates( vertices2 );
                ginfo.recomputeIndices();
                
                // 法線
                NormalGenerator normalGenerator = new NormalGenerator();
                normalGenerator.generateNormals( ginfo );
                
                Shape3D s = new Shape3D();
                Vector quadShapes = new Vector();
                GeometryArray ga = ginfo.getGeometryArray();
                ga.setCapability( Geometry.ALLOW_INTERSECT );
                s.setGeometry( ga );
                quadShapes.addElement( s );
                
                tg = new TransformGroup(new Transform3D());
                this.addChild(tg);
                
                Shape3D shape;
                Enumeration e = quadShapes.elements();
                
                while(e.hasMoreElements() ) {
                        shape = (Shape3D)e.nextElement();
                        shape.setAppearance( ap );
                        // for Picking
                        shape.setCapability(Shape3D.ENABLE_PICK_REPORTING);
                        PickTool.setCapabilities(shape, PickTool.INTERSECT_FULL);
                        tg.addChild( shape );
                }
        
        }

}