ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Java3Dコミュの[専用]質問トピック

  • mixiチェック
  • このエントリーをはてなブックマークに追加
Java3Dの質問のためのトピックです。
どんな質問もウェルカムです。

コメント(56)

車らしい動きというのは難しい質問です。
まず、どのような動きをさせたいのか
はっきりさせる必要があります。

その上で力学的に
速度や慣性の力、車体の重みなどを考慮して
計算しなければならないと思います。

これに関しては既にJava3Dの問題ではないのと
私自身が詳しくないので残念ですがアドバイスできません。
ごめんなさいm(_ _)m
残念ながらこういった物の解説本は存在しないようです。
#ただでさえJava3Dの解説本は少ないのです。

ですので、Java3D単体のリファレンスでしたら英語のマニュアルを当たるのが確実な方法です。

JavaViewって以下のサイトのやつですよね。
http://www.javaview.de/

Mathmaticaとの連携の項があるようなのでとりあえずそこを読んでみてください。
Javaの問題ならアドバイスも可能化と思いますが、質問する時ももう少し具体的な所まで落としていただかないと、そういったアドバイスのしようもないと思われます。
すいません、光源や視点移動についての質問です。
図がないとちょっと説明しにくくて、わかりにくいかもしれませんが、、、

ある物体が原点(0.0, 0.0, 0.0)にあって、自分の初期視点が(0.0, 0.0, 7.0)で、物体とはz軸において7.0の差がある状態で、これを原点を軸に回転するように視点を移動するプログラムを組みたいのですが…

x軸において、物体の裏側まで移動すると、光源の光が届かないからなのか、真っ暗になります。光源を設定しなければならないというのはわかるのですが、どの位置に設定すればいいのかがわかりません。どなたか解決方法がわかる方がいれば、教えてくださいm(__)m

また、x軸方向ではうまく回転できたのですが、y軸方向での回転がまだうまくいっていません。そちらも解決方法がわかりましたら教えてくださいm(__)m

ソースを載せておきます。少しでもわかりやすくするため、一部変更したので、おかしい点もあるかと思いますので、そのときはご指摘してくださるようお願いします。


*******************************************************
/* Peculiar.java */
public class Peculiar {

double eyeX, eyeY, eyeZ; // 視点
int num; // ユーザ番号
boolean flag; // 参加フラグ

// コンストラクタ1
public Peculiar() {
flag = false;
}

// コンストラクタ2
public Peculiar( double x, double y, double z, int n ) {
eyeX = x; eyeY = y; eyeZ = z;
num = n;
flag = true;
}
}


/* AppliFrame.java */

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.media.j3d.*;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.*;
import com.sun.j3d.utils.universe.*;


public class AppliFrame extends JFrame implements KeyListener {

final static int U = 4; // 最大ユーザ数

TransformGroup view; // 視点
Peculiar self; // 視点座標(自分)
Peculiar[] other; // 視点座標(他人)

Node[] n;
Switch selecter;
BitSet flag; // 球体表示フラグ

int on[]; // 他のクライアントが登録した順番
int registNo = 0; // 登録番号
int number; // 自分のクライアント番号

double rad; // 回転角

Container container; // コンテナ
JLabel[] lab, labX, labY, labZ; // ラベル

Transform3D translation;
Transform3D transX, transY, transZ;

BranchGroup root;
Vector3d vector;
Color3f color;


// --------- コンストラクタ ----------- //
public AppliFrame( Peculiar p[], int myself ) {
super( "Application" );

other = new Peculiar[U];
n = new Node[U];
number = myself;

for( int i = 0; i < p.length; i++ ) {
if( i == myself ) {
self = p[myself];
other[i] = null;
}
else
other[i] = p[i];
}

container = getContentPane(); // コンテンツペイン取得
container.setLayout( new BorderLayout() );

Box baseBox = Box.createHorizontalBox();
Box box[] = new Box[U];
lab = new JLabel[U];
labX = new JLabel[U]; labY = new JLabel[U]; labZ = new JLabel[U];

for( int i = 0; i < box.length; i++ )
box[i] = Box.createVerticalBox();

lab[0] = new JLabel( "A" ); lab[0].setForeground( Color.RED );
lab[1] = new JLabel( "B" ); lab[1].setForeground( Color.BLUE );
lab[2] = new JLabel( "C" ); lab[2].setForeground( Color.YELLOW );
lab[3] = new JLabel( "D" ); lab[3].setForeground( Color.GREEN );

for( int i = 0; i < lab.length; i++ ) {
if( i == myself ) {
labX[myself] = new JLabel( "x : " + self.eyeX + " " );
labY[myself] = new JLabel( "y : " + self.eyeY + " " );
labZ[myself] = new JLabel( "z : " + self.eyeZ + " " );
}
else {
if( other[i].flag == true ) {
labX[i] = new JLabel( "x : " + other[i].eyeX + " " );
labY[i] = new JLabel( "y : " + other[i].eyeY + " " );
labZ[i] = new JLabel( "z : " + other[i].eyeZ + " " );
}
else {
labX[i] = new JLabel( "x : --- " );
labY[i] = new JLabel( "y : --- " );
labZ[i] = new JLabel( "z : --- " );
}
}
}

for( int i = 0; i < box.length; i++ ) {
box[i].add( lab[i] ); // A,B,C,Dを追加
box[i].add( labX[i] ); // x 座標値を追加
box[i].add( labY[i] ); // y 座標値を追加
box[i].add( labZ[i] ); // z 座標値を追加
baseBox.add( box[i] );
}

Canvas3D canvas = new Canvas3D( SimpleUniverse.getPreferredConfiguration() ); // Canvas3D クラスのインスタンス生成

container.add( canvas, BorderLayout.CENTER ); // キャンバス位置の設定
container.add( baseBox, BorderLayout.SOUTH ); // 各クライアントの座標値を配置

SimpleUniverse universe = new SimpleUniverse( canvas );

universe.getViewingPlatform().setNominalViewingTransform(); // 視点の移動
universe.addBranchGraph( createSceneGraph() ); // シーングラフを生成

translation = new Transform3D();
translation.setTranslation( new Vector3d (self.eyeX, self.eyeY, self.eyeZ) ); // 視点を設定

canvas.addKeyListener( this ); // リスナ追加

// 視点の変更
view = universe.getViewingPlatform().getViewPlatformTransform();
view.setTransform( translation );

setSize( 700, 600 );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setVisible( true );
}

// -------- シーングラフを生成するメソッド --------- //
public BranchGroup createSceneGraph() {
root = new BranchGroup();
// root.setCapability( Group.ALLOW_CHILDREN_EXTEND ); //

Vector light = new Vector();

root.addChild( createShareObj() ); // 物体をシーングラフに追加

light.addElement( createLight( 1.0f, -1.0f, 1.0f ) ); // 光源
/* (光源はこれから追加予定) */


// 光源をシーングラフに追加
for( Enumeration enu = light.elements(); enu.hasMoreElements(); ) {
root.addChild( (Node)enu.nextElement() );
}


// 他のユーザを表す球体を生成
for( int i = 0; i < U; i++ ) {
if( i != number ) {
vector = new Vector3d( other[i].eyeX, other[i].eyeY, other[i].ey
eZ );

if( i == 0 )
color = new Color3f( 1.0f, 0.0f, 0.0f ); // 赤
else if( i == 1 )
color = new Color3f( 0.0f, 0.0f, 1.0f ); // 青
else if( i == 2 )
color = new Color3f( 1.0f, 1.0f, 0.0f ); // 黄色
else
color = new Color3f( 0.0f, 1.0f, 0.0f ); // 緑

n[i] = createSphere( vector, color ); // 球を生成
}
else
n[i] = null;
}

// 球体の表示・非表示を設定
selecter = new Switch( Switch.CHILD_MASK );
selecter.setCapability( Switch.ALLOW_SWITCH_WRITE ); // 書込みを許可
flag = new BitSet( U-1 );
on = new int[U];

for( int i = 0; i < U; i++ ) {
if( n[i] != null ) {
selecter.addChild( n[i] ); // 球
// System.out.println( "ADD " + i );
if( other[i].flag == true )
flag.set( registNo );
else
flag.clear( registNo );

on[i] = registNo++; // 番号を登録
}
}
selecter.setChildMask( flag );
root.addChild( selecter );

return root;
}

// ----------- 光源の設定を行うノード ------------- //
public Node createLight( float posX, float posY, float posZ ) {
Light light = new PointLight( new Color3f (10.0f, 10.0f, 10.0f ), // 光の色
new Point3f ( posX, posY, posZ ), // 光源の位置
new Point3f ( 0.1f, 0.1f, 0.0f ) // 光の減衰率
);

BoundingSphere bounds = new BoundingSphere( new Point3d(posX, posY, posZ), Double.POSITIVE_INFINITY );
light.setInfluencingBounds( bounds ); // 描画範囲の定義
light.setEnable( true );

return light;
}

// ---------- 球の設定を行うノード ------------ //
public Node createSphere( Vector3d vector, Color3f color ) {
Transform3D translation = new Transform3D();
translation.setTranslation( vector );
TransformGroup transform = new TransformGroup( translation );

/***** 外観に関する設定 *****/
Appearance appearance = new Appearance();
Material material = new Material();
material.setDiffuseColor( color ); // 球体の色の設定
material.setLightingEnable( true );
appearance.setMaterial( material );

Sphere sphere = new Sphere( 0.1f, Sphere.GENERATE_NORMALS, appearance ); // 球体の生成
transform.addChild( sphere );

return transform;
}

// ----------- 物体を設定するノード -------------- //
public Node createShareObj() {
BranchGroup objRoot = new BranchGroup();
ShareObj obj = new ShareObj();
objRoot.addChild( obj.shape );

return objRoot;
}

// ---------- x 軸方向に回転する計算を行うメソッド ----------//
public void rotateX( double deg ) {
double tmpX = self.eyeX;
double tmpY = self.eyeY;
double tmpZ = self.eyeZ;
rad = deg / 180.0 * Math.PI;

self.eyeX = tmpX * Math.cos( rad ) - tmpZ * Math.sin( rad );
self.eyeY = tmpY;
self.eyeZ = tmpX * Math.sin( rad ) + tmpZ * Math.cos( rad );
}


// ----------- y 軸方向に回転する計算を行うメソッド ------------ //
public void rotateY( double deg ) {
double tmpX = self.eyeX;
double tmpY = self.eyeY;
double tmpZ = self.eyeZ;
rad = deg / 180.0 * Math.PI;

self.eyeX = tmpX;
self.eyeY = tmpY * Math.cos( rad ) + tmpZ * Math.sin( rad );
self.eyeZ = -tmpY * Math.sin( rad ) + tmpZ * Math.cos( rad );
}

// キーボード処理を行うメソッド
public void keyTyped( KeyEvent key ) {}

public void keyReleased( KeyEvent key ) {}

public void keyPressed( KeyEvent key ) {
switch( key.getKeyCode() )
{
case KeyEvent.VK_UP: // 上向きカーソルキー
rotateY( 5.0 );
break;

case KeyEvent.VK_DOWN: // 下向きカーソルキー
rotateY( -5.0 );
break;

case KeyEvent.VK_LEFT: // 左向きカーソルキー
rotateX( 5.0 );
break;

case KeyEvent.VK_RIGHT: // 右向きカーソルキー
rotateX( -5.0 );
break;

case KeyEvent.VK_PAGE_UP: // PageUp キー
self.eyeZ -= 0.5;
break;

case KeyEvent.VK_PAGE_DOWN: // PageDOWN キー
self.eyeZ += 0.5;
break;

case KeyEvent.VK_ENTER: // エンターキーまたはR
case KeyEvent.VK_R:
self.eyeX = 0.3; self.eyeY = 0.3; self.eyeZ = 7.0;
rad = 0.0; // 初期状態に戻す
break;

case KeyEvent.VK_ESCAPE: // エスケープキーまたはQ
case KeyEvent.VK_Q:
System.exit(0); // 終了
break;

default:
break;
}


translation = new Transform3D();
translation.setTranslation( new Vector3d (self.eyeX, self.eyeY, self.eye
Z) ); // 視点を設定

// transX = new Transform3D();
// transX.rotX( rad );

transY = new Transform3D();
// transY.rotY( rad );
transY.rotY( Math.atan( self.eyeX / self.eyeZ ) );

translation.mul( transY );

view.setTransform( translation ); // 視点の変更

// 変更した座標値を表示
for( int i = 0; i < lab.length; i++ ) {
if( i == number ) {
labX[number].setText( "x : " + self.eyeX + " " );
labY[number].setText( "y : " + self.eyeY + " " );
labZ[number].setText( "z : " + self.eyeZ + " " );
}
else {
if( other[i].flag == true ) {
labX[i].setText( "x : " + other[i].eyeX + " " );
labY[i].setText( "y : " + other[i].eyeY + " " );
labZ[i].setText( "z : " + other[i].eyeZ + " " );
}
else {
labX[i].setText( "x : --- " );
labY[i].setText( "y : --- " );
labZ[i].setText( "z : --- " );
}
}
}
}


// ------ main メソッド ----------- //
public static void main( String[] args ) {
Peculiar p[] = new Peculiar[U];

p[0] = new Peculiar( 0.3, 0.3, 7.0, 0 );
p[1] = new Peculiar();
p[2] = new Peculiar( 0.3, 0.8, 3.0, 2 );
p[3] = new Peculiar( 0.3, 0.3, 2.0, 3 );

AppliFrame af = new AppliFrame( p, 0 );
}
}
自分の初期視点は(0.0, 0.0, 7.0)じゃなくて(0.3, 0.3, 7.0)でした。すいませんm(__)m
> 23: いとをさん、

> 光源を設定しなければならないというのはわかるのですが、ど
> の位置に設定すればいいのかがわかりません。どなたか解決方
> 法がわかる方がいれば、教えてくださいm(__)m

原点を中心とした点対称な位置に光源を設定してみてはいかがでしょうか?

> light.addElement( createLight( 1.0f, -1.0f, 1.0f ) ); // 光源

( -1.0f, 1.0f, -1.0f ) ですかね。

> また、x軸方向ではうまく回転できたのですが、y軸方向で
> の回転がまだうまくいっていません。そちらも解決方法がわ
> かりましたら教えてくださいm(__)m

Canvas3D に addKeyListener でキーリスナーを追加していますが、Java3D ではマウス&キーボードのイベントは Behavior クラスを使って処理します。

キーボードによる移動は com.sun.j3d.utils.behaviors.keyboard.KeyNavigatorBehavior クラス。
マウスによる移動は com.sun.j3d.utils.behaviors.vp.OrbitBehavior クラスを使うのが一般的でしょうか。

Java3D KeyNavigatorBehavior で google 検索してみれば使い方が分かると思います。

ちなみに KeyNavigatorBehavior には CPU 使用率が 100% になるという不具合があるので注意してください。
解決方法は以下参照

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4376368
へびさん、ありがとうございます。参考にさせていただきますm(__)m

あと、別の質問なのですが、一度表示した球の位置を別の位置に表示(移動)させたいとき、どうすればよいのでしょうか?
たぶん球を生成したときに設定したローカル座標系を変更するという処理を行えばよいのだと思いますが、、、

javax.media.j3d.RestrictedAccessException: Cannot modify capability bits on a live or compiled object という例外が発生してしまい、うまく変更することができないのです。

うまく説明できないので、ちょっとわかりにくいかもしれませんが…
どなたか同じ条件でうまく行っている、もしくは情報お持ち
でしたら、情報提供をお願いいたしますm(__)m

現在Java3Dで作った3DチャットをJava Web Startで配信してい
ます。ユーザが通常の方法でJava3Dをインストールしても
Java自体の最新アップデートでアプリが動かなくなってしまう
ため、j3d-websartでJava3DのライブラリをJava Web Start
配信するように変更しました。

このj3d-webstartのページ
https://j3d-webstart.dev.java.net/
を見ると、どうやらMac OS Xがサポートされているようです
ので早速試したところ、Canvas3D作るあたりでJavaVM自体が
お亡くなりになりました(泣)。
コンソールまでパッと消えてなくなります。

サーバに残っていたMac側のUser-Agentは
JNLP/1.5 javaws/1.5.0 (<internal>) J2SE/1.5.0_07
です。Javaは勝手にMacのサイトからアップデートされたもの
だとオーナーは申しておりました。

よろしくお願いいたします。
>ライスさま

previous release buildsにありますよ。
https://java3d.dev.java.net/binary-builds-old.html
28の件、私のポカでした。
L&FをWindowsにしている部分でエラーになっていたようです。
さらにその部分でExceptionをキャッチしたらSystem.exit(1);
してました。アホだ。。。

お騒がせしましたm(__)m
>ばじゃさん
解決できてよかったです。
Java3Dのバグじゃなくってこちらも安心です。
> 38: Kenji☆Lucky star さん

私は Java3D を使って 3D CAD を作りました。
座標変換など学び直すことが多かったです。
ずいぶん前に物理シミュレーションのアプリを作った事があります。
ただし、Java3Dの動作モデルは非常に興味深いですけど、あまりそれ向きではなかったなぁと感じました。
こんにちは!

突然の質問ですみません。今、私はボタンを押してボックスが回転するプログラムを作っているのですが、なかなかうまくできません。ボタンを押してもボックスに全く回転の操作が伝わってなく変化がありません。
回転がうまくできないので、ボックスの色を変えてみるプログラムに切り替えてやってみたのですが、それもうまくいきませんでした。
誰かこの問題の解決方法を知っているという方がいましたら、回答お願いしますm(_ _)m
> 42: ゆーたん さん、

回転したいボックスを載せている TransformGroup を操作すれば回転できるようになります。


こういう質問のされ方をするとこういう風にしか回答できません。
的確な回答が欲しいなら、せめてあなたの作成したソース(該当箇所の抜粋)を掲載してください。
> 42: ゆーたん さん、

ボタンを押したときのイベントは拾えてます?
>へびさん

回答ありがとうございます!回転したいボックスをTransformGroupに載せればいいのですね、やってみますわーい(嬉しい顔)


>Matubaraさん
回答ありがとうございます!ボックスが表示されている空間にはボタンのイベントが反映されてなく拾えてません。システム的には、動作しているのですが・・・。
どうも初めまして
Java及びJava3Dを弄り始めて間もない人間です。

Web等で色々探して見てみても、言葉(言い回し?)が難しくて分からないのでココで質問させていただきます冷や汗


外部ファイル(テキストファイルなど)に書いた座標値を読み込んで、
立体を描画させるにはどの様な記述をすればよろしいのでしょうか。
(ReadfileやBufferedReader等を利用するのは何となく分かるのですが;)


できれば同じく外部ファイル値を元にして
複数の点(Point3d(x,y,z))を描画させる方法なども教えて下さい。
> 46:卵の殻を被った黒いの さん
> 外部ファイル(テキストファイルなど)に書いた座標値を読み込んで、
> 立体を描画させるにはどの様な記述をすればよろしいのでしょうか。

ご指摘の通り、java.io.BufferedReader を使うのが良いと思います。
BufferedReader を使って読み込んだ文字列を double 型に変換して、javax.vecmath.Point3d を作成します。

> 複数の点(Point3d(x,y,z))を描画させる方法なども教えて下さい。

javax.media.j3d.PointArray を使ってください。
以下にサンプルがあります。

  http://www.javaopen.org/j3dbook/text/program2.html
>>へびさん
丁寧な説明をしてくださり、ありがとう御座います。

もう一度、挑戦してみますexclamation ×2
(もしかしたら、またお訊ねするかも知れませんが・・・・・・)
度々すみません
一応挑戦してみましたが期待通りのものができません涙
import文を除いたプログラムを載せます。↓
-------------------------------------
public class Point02 extends Applet {
Double a = 0.0;

public Point02() {
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas = new Canvas3D(config);
this.setLayout(new BorderLayout());
this.add(canvas, BorderLayout.CENTER);

SimpleUniverse universe = new SimpleUniverse(canvas);
universe.getViewingPlatform().setNominalViewingTransform();

BranchGroup scene = createSceneGraph();

universe.addBranchGraph(scene);
}

private BranchGroup createSceneGraph() {
BranchGroup root = new BranchGroup();
try{
File file = new File("C:\\a.txt");//txt読み込み

if (checkBeforeReadfile(file)){
BufferedReader br = new BufferedReader(new FileReader(file));

String str;
while((str = br.readLine()) != null){
//System.out.println(str);
Double s = Double.parseDouble(str);
a = s;
}

br.close();
}else{
System.out.println("ファイルが見つからないか開けません");
}
}catch(FileNotFoundException e){
//System.out.println(e);
}catch(IOException e){
//System.out.println(e);
}

//座標の決定
Point3d[] vertices = new Point3d[3];
vertices[0] = new Point3d(a, -0.8, 0.0);
vertices[1] = new Point3d(0.5, -0.4, 0.0);
vertices[2] = new Point3d(-0.6, 0.7, 0.0);

PointArray geometry = new PointArray(vertices.length, GeometryArray.COORDINATES);
geometry.setCoordinates(0, vertices);

Shape3D shape = new Shape3D(geometry);

root.addChild(shape);

return root;
}

public static void main(String[] args) {
Point02 applet = new Point02();
MainFrame frame = new MainFrame(applet, 500, 500);
}

   private static boolean checkBeforeReadfile(File file){
if (file.exists()){
if (file.isFile() && file.canRead()){
return true;
}
}
return false;
   }
}
-------------------------------------
テキストファイルから座標全てを読み込んで、
全ての座標(x,y,z)に割り当てる方法が分かりません。
(テキストファイルの記入方法も曖昧です)
> 49:卵の殻を被った黒いの さん

上記のプログラムできちんと 3 点が表示されますが、どういったものを期待されているのでしょうか?

> (テキストファイルの記入方法も曖昧です)

テキストファイルのフォーマット(書式)も決まっていないのに座標を読み込もうというのは無茶すぎます。
フォーマットが決まっていないのであればアドバイスすることもできません。

まずはきちんと設計してからプログラムを組んでください。

P.S.
ファイルI/Oで困っているのであれば、Java3D のコミュニティではなく、一般的な Java のコミュニティで質問される方が良いかと思います。
>テキストファイルの記入方法も曖昧
・数値を連続して横に並べる場合、数値と数値の間は空白と”,”のどちらを利用すれば良いのか。もしくはそれ以外の記述でないと読み込めないのか。
 が、分からないという意味です。

上記のプログラムの内、読み込んだ値をaに代入していますが、
もし読み込む数値が複数あった場合(xだけでなくyやzの値も同時に)、全てを変数に代入するにはどの様にすれば良いのかが分かりません。

→複数の座標を読み込んで代入処理を行う方法が分かりません。


という意味で書きましたが、分かり辛い書き方で申し訳御座いません。
数値と数値の間は空白でもカンマでもどんな文字でも良いと思います。
ある区切り文字で文字列を分割し、それを x, y, z に入れてあげればいいのです。

while((str = br.readLine()) != null){
    String[] array = str.trim().split( "[\\s,]+" );
    double x = Double.parseDouble( array[0] );
    double y = Double.parseDouble( array[1] );
    double z = Double.parseDouble( array[2] );
}

上記の方法は正規表現を使って文字列を分割しています。
この場合、区切り文字は空白、タブ、カンマです。(どれでもOK)
>>へびさん
どうも有難うございますexclamation ×2
無事に求めていた結果を表示させることができました。
何度もすみません。

読み込んだ多数の座標を線で結び、その内部をメッシュの様に線で埋めることは可能でしょうか。

(外部から読み込んだ多数の3次元座標を元に、多角立体図を作成する事は可能でしょうか。)
>54
z[i]=Z(x[i], y[i])
x[i]=x[i-1]+Δx
y[i]=y[i-1]+Δy
のような規則的に並んでいるもの、特にこのように四角形のメッシュはQuadArrayクラスがいいでしょう。

http://java.sun.com/javase/technologies/desktop/java3d/forDevelopers/J3D_1_3_API/j3dapi/javax/media/j3d/QuadArray.html

説明は、Java 3D tutorialにあります。

http://java.sun.com/developer/onlineTraining/java3d/

Chapter 2, Creating Geometry: Creating objects in the scene graph. (PDF)
http://java.sun.com/developer/onlineTraining/java3d/j3d_tutorial_ch2.pdf

この2.5章あたりを見るとよかったかな?
>ごーやーまんさん
有難う御座います。
参考にして研究してみます。

ログインすると、残り28件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Java3D 更新情報

Java3Dのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング