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