반응형
첫 번째로 지난 기사 ′3D 모델을 보여주는 자바 애플릿의 작성′에서는 3D 모델을 보기 위한 애플릿을 소개했습니다.지난 시간에는 3D보기의 기초를 학습하는데 목적이 있었기 때문에 굳이 0에서 3D보기를 위한 프로그램을 만들었는데, 자바3D를 사용하면 3D보기를 쉽게 할 수 있습니다.이번에는 이 자바3D를 사용해서 심플한 어플리케이션을 하나 만들어 보겠습니다.하지만 자바3D를 사용하여 입체모델 표시를 하는 샘플은 자바3D를 설치하면 따라오고, 다른 웹사이트에도 많이 소개가 되어있기 때문에 자바3D의 도입과 기본부분은 다른 정보원에 넘기기로 하고, 이번 기회에 차후 3D앱 개발에 도움이 되는 툴을 만들어보도록 하겠습니다.자바3D를 실제로 사용해 보신 분들은 3D모델을 보여줄 때 사용할 재질을 어떻게 설정해야 하는지 고민해보셨을 것입니다.재질을 설정하려면 Material 클래스를 사용합니다만, 이 클래스의 속성으로 지정할 수 있는 「확산광」 「환경광」 「경면광」 「방사광」의 색에는 각각 RGB의 성분을 지정할 필요가 있어 전부 4×3=12 종류의 값을 결정하지 않으면 안됩니다.게다가 「휘도」와「투명도」도 고려하면, 무려 14종류! 의도한 표시 결과를 얻으려면 , 이러한 값을 적절히 설정할 필요가 있지만, 좀처럼 이미지 그대로의 재질을 얻는 것은 용이하지 않습니다.그 결과 값을 미세하게 변경하면서 실행 결과를 확인하고 다시 시작하는 시행착오가 반복되기도 했고 이는 이제 힘든 작업입니다.그래서 이번에는 Java3D에서 사용할 재질을 그림1과 같은 화면에서 선택하고, 나아가 Material 클래스의 속성을 설정하는데 필요한 Java의 코드를 출력해 주는 툴을 만들어 보도록 하겠습니다(단, 광원은 고정이고 텍스처 이미지도 사용하지 않는 것으로 합니다). GUI에는 Swing을 사용하기 때문에 Java3D와 Swing 모두 도움이 된다면 좋겠습니다.대상독자 Java3D, Swing 기초를 배우고 싶은 사람, Java3D(또는 OpenGL이나 DirectX)로 재질설정에 고생한 적이 있는 사람이 대상입니다.필요한 환경 J2SE Development Kit (JDK) 1.4.x 이상, Java 3D 1.3.x 이상이 필요합니다.Material 속성 이번에 작성하는 어플리케이션은 Java3D에서 사용하는 Material(재질) 클래스의 속성을 정하는 각종 파라미터를 설정하기 위한 것입니다.여기서 등장하는 Ambient(환경광), Diffuse(확산광), Specular(경면광), Emission(방사광), Shiniess(휘도)는 각각 Material 클래스의 set Ambient Color, set Diffuse Color, set Specular Color, set Emissive Color, set ShinininessTransparency(투명성) 는 Transparency Attributes 클래스의 set Transparency 메서드로 설정합니다.이 용어들은 CG소프트를 다루고 있으면 자주 볼 수 있을 것 같은데, 각각 다음과 같은 의미를 가지고 있습니다.Ambient(환경광): 물체 전체를 균일하게 비추는 빛(직접 빛이 닿지 않는 곳을 희미하게 밝게 하는 작용이 있습니다)
Diffuse(확산광) : 광원으로부터의 빛이 물체에 부딪쳐 산란되는 빛
Specular(경면광) : 광원으로부터의 빛이 반사한 빛(′반사광′이라고도 합니다)
Emission (방사광) : 물체 자체가 발하는 빛
Shiniess (휘도) : 경면 빛의 반사 날카로움 (값이 크면 작은 영역에서 날카롭게 반사되고 값이 작으면 넓은 영역에서 희미하게 반사됩니다)
Transparency(투명도):물체의 투명도(값이 0이면 전혀 투과하지 않고 값이 1이 되면 완전히 투명해집니다) 이 모든 것을 수동으로 설정하는 것은 힘들기 때문에 일반적으로 자주 있는 재질 에디터에서는 확산광의 색을 결정하면 다른 색이 자동적으로 결정되거나 방사광의 항은 아예 없는 것으로 하고 있는 경우가 있습니다.확산광이 빨강인데 환경광이 파랑이고 경면광이 녹색이라고 하는 재질은 별로 현실적이지 않고, 이러한 묘한 성질을 가지는 재질이 필요하게 되는 경우는 드물기 때문에, 확산광만 결정해 버리면 그것을 바탕으로 다른 빛을 정해 버려도 문제 없는 것이 많습니다.그러나 Java3D에서는 (OpenGL, DirectX등도) 각각의 빛의 색을 개별적으로 설정할 수 있는 기능이 갖추어져 있기 때문에, 이번은 모두 독립적으로 설정할 수 있도록 해 보았습니다.이번 어플리케이션을 한번 만져보고 시도를 해보시면 각각의 색을 의미하는 바를 알 수 있을 겁니다.또 지금까지 본 적이 없는 재미있는 느낌을 주는 재질을 발견할 수도 있을 것입니다.Swing으로 어플리케이션의 외관을 만드는 이번에는 AWT(Abstract Window Toolkit)가 아닌 Swing을 사용하여 어플리케이션의 GUI를 만들도록 하겠습니다.Swing을 이용한 코딩은 기본적으로 AWT를 사용한 경우와 큰 차이는 없지만 Swing에는 색상 선택을 위한 컴포넌트 JColor Chooser 클래스가 있습니다.이 Swing에 포함된 JColor Chooser를 활용합니다.작성하시는 어플리케이션의 기본 클래스를 MaterialEditor로 하고 다음과 같이 선언합니다.Material Editor 클래스 선언
public class MaterialEditor extends JFrame
implements ActionListener , ChangeListener , AdjustmentListener {
// (중략)
}} 위 선언과 같이 메인 클래스는 Swing의 JFrame을 상속받고 나중에 추가하는 Swing의 부품으로부터 이벤트 통지를 받기 위하여 Action Listener(버튼의 이벤트용), Change Listener(JColor Chooser의 이벤트용), Adjustment Listener(스크롤바의 이벤트용)를 구현합니다.각각의 이벤트가 발생했을 때 불리는 메서드는 action Performed, state Changed, adjustment Value Changed 입니다.이제 Swing의 각 UI 부품을 사용하여 어플리케이션의 외관을 결정합니다.이번 GUI 부품의 레이아웃 모습은 그림 2와 같습니다.그림과 같은 레이아웃을 실현하기 위해서, 다음과 같이 코드를 기술합니다.GUI 부품 구축
private void buildUI ( ) {
// 상부 패널
// (렌더링 캠퍼스 + 파라미터 편집 패널) 만들기
JPanel panelNorth = new JPanel ( ) ;
panelNorth . setLayout ( new FlowLayout ( )) ;
panelNorth . add ( createCanvas ( )) ;
panelNorth . add ( createParamEditPanel ( )) ;
// 색상 선택 패널 만들기
JPanel panelCenter = new JPanel ( ) ;
colorChooser = new JColorChooser ( ) ;
colorChooser . getSelectionModel ( ) . addChangeListener ( this ) ;
panelCenter . add ( colorChooser ) ;
//하부 패널(코드 출력 버튼) 생성
JPanel panelSouth = new JPanel ( ) ;
panelSouth . add ( outputButton = new JButton ( ′ コード 出力 ′ )) ;
outputButton . addActionListener ( this ) ;
// 상부 패널과 하부 패널을 프레임에 추가
getContentPane ( ) . setLayout ( new BorderLayout ( )) ;
getContentPane ( ) . add ( panelNorth , BorderLayout . NORTH ) ;
getContentPane ( ) . add ( panelCenter , BorderLayout . CENTER ) ;
getContentPane ( ) . add ( panelSouth , BorderLayout . SOUTH ) ;
} 우선 기초가 되는 JFrame의 콘텐츠 레이아웃을 Border Layout으로 설정하고 NORTH(′북′ 즉 위), CENTER(중앙), SOUTH(′남′ 즉 아래) 각각에 JPanel을 배치합니다.이를 통해 크게 3개의 패널이 어플리케이션에 배치됩니다.중앙 패널에는 색상 선택용 J Color Chooser를 하나, 아래 패널에는 코드 출력용 J Button을 하나 배치하기만 하면 되기 때문에 특별히 어려운 점은 없습니다.위쪽 패널은 레이아웃을 Flow Layout으로 하고 좌측에 렌더링 결과를 표시하는 3D캔버스(create Canvas 메서드로 작성)를, 우측에는 파라미터를 변경하기 위한 버튼과 스크롤바를 배치한 다른 패널(create Param Edit Panel 메서드로 작성)을 배치하고 있습니다.파라미터 편집용 패널은 다음과 같이 Grid Layout을 이용해 6행 2열의 부품을 배치합니다.gridlayoutを使用した部品の配置
전용 JPanel createParamEditPanel() {
JPanel 패널 = 새 JPanel();
패널.기본 설정 크기(새 치수(300, Render_CANVAS_SIZE));
패널.레이아웃 설정(새 그리드 레이아웃(6, 2, 10, 5));
(inti = 0, i = 6; i++) {에 대해
// ラベルの追加
panel.add(paramNameLabels[i]
= 새 JLabel(labelNames[i]), JLabel.오른쪽);
if(i < 4) {
// ボタンの追加
파라미터 버튼[i] = 새 JB 버튼();
panel.add(paramButtons[i]);
param 버튼 [i]add Action Listener(이것);
} 기타 {
// スクロールバーの追加
intbarIndex = i - 4;
paramScrollBars[barIndex]
= 새 JScrollBar(JScrollBar).수평, 0, 1, 0, 100);
paramScrollBars[barIndex]를 선택합니다.Add Adjustment Listener(이것);
panel.add(paramScrollBars[barIndex]);
}
}
리턴 패널;
}{경계선 배치}{흐름 배치}{그리드 배치}{{자바}}{{{{{{{{}}}}}{{{{{{{{{{{{{{{}}}}}}}}{{{{{{{{{{}}}}}}}}}}}}api仕様書を見ると、それぞれのレイアウト方法の特徴を理解できるでしょう。borderlayout
플로우 레이아웃
gridlayoutアプリケーションのインターフェース色の編集は画面中央のjcolorchooserを利用した色選択パネルで行います。jcolorchooserは非常に便利なクラスで、色を選択するために次の3通りの方法を提供します。ユーザーはそれぞれから好きな方法で色を選択できます。サンプルカラーからの選択
hsb値の指定
rgb値の指定ここで選択する色は、ambient(環境光)、diffuse(拡散光)、specular(鏡面光)、emission(放射光)の4つの光の色の1つに反映されます。対象となる光は、右上のラベルが青い四角の枠で囲まれています(起とtransparency(透明度)はスクロールバーで変更します。どちらも右に行くほど値が大きくなります。java3dを用いてレンダリング結果を表示するキャンバス3dオブジェクトを表示するためのキャンバスがcanvas3dクラスです。java3D→→캔버스3dオブジェクトを作成し、simpleuniverseクラスのコンストラクタに渡します。その後、simpleuniverseクラスのaddbranchgraphメソッドを使用して3d要素を追加します。canvas3dオブジェクトの作成は、次のように行っています。canvas3dの作成
개인 Canvas 3D CreateCanvas() {
그래픽 구성 구성
= SimpleUniverse.getPreferred Configuration();
Canvas 3D 캔버스 = 새 Canvas 3D(config);
캔버스.setSize(RENDER_CANVAS_)크기, Render_CANVAS_SIZE);
단순한 우주 = 새로운 단순한 우주(캔버스);
universe.getViewingPlatform().setNomalViewTransform();
universe.add BranchGraph(지점 그래프 만들기());
캔버스 반환;
}今回はcreatebranchgraphメソッドで、球体を1つ表示するだけの簡単なシーンを作成します。このシーンを表すbranchgroupには、次の要素を追加します。平行光源(lightオブジェクト):右斜め上から球体を照らす白色光源
環境光(lightオブジェクト):球体全体を均一に照らす光源
背景イメージ(backgroundオブジェクト):球体の透明度を識別するために追加する黒と白のチェック柄のイメージ
球体(sphereオブジェクト):材質の設定結果を確認するための球体次のコードようにbranchgroupオブジェクトのaddchildメソッドを使用して、これらの要素を登録します。canvas3dとbranchgroupの追加
전용 BranchGroup createBranchGraph() {
분기 그룹 분기 그룹 = 새 분기 그룹();
// 平行光源の追加
branchGroup.addChild(createDirectionalLight());
// 環境光の追加
branchGroup.addChild(createAbientLight();
//背景イメージの追加
branchGroup.addChild(createBackgroundImage();
// レンダリング対象の球体を追加
branchGroup.addChild(CreateSphere());
branchGroup.compile();
branchGroup 반환;
}sphereオブジェクトの作成java3dに準備されているsphereクラスを使用することで、簡単に球体の3dモデルを作成できます。sphereクラスには6種類ものコンストラクタがありますが、今回は半径、法線の設定の指定、分割数(値が大きいほど滑ら
sphere(float radius, int primflags, int divisions, appearance ap) ここで指定するappearanceが、ambient(環境光)などに関係するmaterialと、transparency(透明度)に関係するtransparencyattributesを保持します。つまり、sphereオブジェクトを作成する前に、容がわかると思います。sphereオブジェクトの作成
개인 구 작성구() {
// 재료 の // // //
재료 재료 = 새 재료();
물질적인.공정 능력 설정(재료).ALLOW_COMPONENT_READ);
물질적인.공정 능력 설정(재료).허용_구성 요소_쓰기);
물질적인.setLightingEnable(true);
// 투명도 속성 ▲▲▲▼
투명도 속성 투명도 = 새로운 것
투명 특성(투명 속성).혼합, 0.0f);
투명도
.setCapability(투명 속성)를 선택합니다.ALLOW_VALUE_READ );
투명도
.setCapability(투명 속성)를 선택합니다.허용_VALUE_WRITE );
// 외관 → → → → → →
m_배경 = 새로운 모습();
m_complacement.기능 설정(외관).허용_Material_READ);
m_complacement.기능 설정(외관).허용_재료_쓰기);
m_complacement.기능 설정(
외모.ALLOW_TRANSPANCE_ATRICTUES_READ);
m_complacement.기능 설정(
외모.허용_TRANSPANCY_Attributes_WRITE);
// 외관 → 재료 → → → → →
m_complacement.재료(재료) 세트;
// 외관 → 투명 속성 → → → →
m_등장.투명 속성 설정(투명도);
// 구 の の の面
구면 = 새로 만들기
구(0.7f, 구)GENERATE_NORMALS, 128, m_외관);
sphere.getShape().setCapability(Shape3D).허용_외관_쓰기);
sphere.getShape().setCapability(Shape3D).허용_외관_읽기);
반환 구;
}材質設定用のコードを出力する各パラメータを変更してレンダリング結果の変化を見るだけでも楽しいですが、せっかくなのでここで編集した材質をjava3dを用いたプログラムで使用できるように、javaのコードを出力する機能を追加してみます。今回は、アプリケーションの下の方にある「コード出力」ボタンを押すと次のようなフレームが現れ、テキストエリアにコcボタンでクリップボードにコピーすれば、任意のテキストエディタにコピーすることができます。コードの出力は、テキストエリアに値を書き出すだけですので大したことは行っていませんが、decimalformatクラスを使
소수 형식 형식 = 새 소수 형식(′0.0000′);このコンストラクタで作成したオブジェクトのformatメソッドを使用すると、指定したフォーマットで値を文字列に変換できます。今回はjava言語で材質を設定するためのコードを出力するようにしましたが、必要に応じて材質を設定するコードの出力
사설 void 출력 코드() {
재료 재료 = m_외관. 재료 가져오기();
색상 3f 색상 = 새 색상 3f();
J프레임 프레임 = 새 J프레임(′코드′);
틀에 끼우다.setBounds(100, 100, 500, 250);
JTextArea 텍스트 영역 = 새 JTextArea();
텍스트 영역.SetLineWrap(참);
소수 형식 형식 = 새 소수 형식(′0.0000′);
textArea.adpend(′재료 = 새 재료();′);
재료.주변 색상(색상)을 구합니다;
textArea.adpend(′자료).주변 색상 설정(′
+ form.format(color.x) + ′f, ′
+ form.format(color.y) + ′f, ′
+ form.format(color.z) + ′f′;′);
// (中略)
frame.add(textArea);
틀에 끼우다.표시 가능(참) 설정;
}
Diffuse(확산광) : 광원으로부터의 빛이 물체에 부딪쳐 산란되는 빛
Specular(경면광) : 광원으로부터의 빛이 반사한 빛(′반사광′이라고도 합니다)
Emission (방사광) : 물체 자체가 발하는 빛
Shiniess (휘도) : 경면 빛의 반사 날카로움 (값이 크면 작은 영역에서 날카롭게 반사되고 값이 작으면 넓은 영역에서 희미하게 반사됩니다)
Transparency(투명도):물체의 투명도(값이 0이면 전혀 투과하지 않고 값이 1이 되면 완전히 투명해집니다) 이 모든 것을 수동으로 설정하는 것은 힘들기 때문에 일반적으로 자주 있는 재질 에디터에서는 확산광의 색을 결정하면 다른 색이 자동적으로 결정되거나 방사광의 항은 아예 없는 것으로 하고 있는 경우가 있습니다.확산광이 빨강인데 환경광이 파랑이고 경면광이 녹색이라고 하는 재질은 별로 현실적이지 않고, 이러한 묘한 성질을 가지는 재질이 필요하게 되는 경우는 드물기 때문에, 확산광만 결정해 버리면 그것을 바탕으로 다른 빛을 정해 버려도 문제 없는 것이 많습니다.그러나 Java3D에서는 (OpenGL, DirectX등도) 각각의 빛의 색을 개별적으로 설정할 수 있는 기능이 갖추어져 있기 때문에, 이번은 모두 독립적으로 설정할 수 있도록 해 보았습니다.이번 어플리케이션을 한번 만져보고 시도를 해보시면 각각의 색을 의미하는 바를 알 수 있을 겁니다.또 지금까지 본 적이 없는 재미있는 느낌을 주는 재질을 발견할 수도 있을 것입니다.Swing으로 어플리케이션의 외관을 만드는 이번에는 AWT(Abstract Window Toolkit)가 아닌 Swing을 사용하여 어플리케이션의 GUI를 만들도록 하겠습니다.Swing을 이용한 코딩은 기본적으로 AWT를 사용한 경우와 큰 차이는 없지만 Swing에는 색상 선택을 위한 컴포넌트 JColor Chooser 클래스가 있습니다.이 Swing에 포함된 JColor Chooser를 활용합니다.작성하시는 어플리케이션의 기본 클래스를 MaterialEditor로 하고 다음과 같이 선언합니다.Material Editor 클래스 선언
public class MaterialEditor extends JFrame
implements ActionListener , ChangeListener , AdjustmentListener {
// (중략)
}} 위 선언과 같이 메인 클래스는 Swing의 JFrame을 상속받고 나중에 추가하는 Swing의 부품으로부터 이벤트 통지를 받기 위하여 Action Listener(버튼의 이벤트용), Change Listener(JColor Chooser의 이벤트용), Adjustment Listener(스크롤바의 이벤트용)를 구현합니다.각각의 이벤트가 발생했을 때 불리는 메서드는 action Performed, state Changed, adjustment Value Changed 입니다.이제 Swing의 각 UI 부품을 사용하여 어플리케이션의 외관을 결정합니다.이번 GUI 부품의 레이아웃 모습은 그림 2와 같습니다.그림과 같은 레이아웃을 실현하기 위해서, 다음과 같이 코드를 기술합니다.GUI 부품 구축
private void buildUI ( ) {
// 상부 패널
// (렌더링 캠퍼스 + 파라미터 편집 패널) 만들기
JPanel panelNorth = new JPanel ( ) ;
panelNorth . setLayout ( new FlowLayout ( )) ;
panelNorth . add ( createCanvas ( )) ;
panelNorth . add ( createParamEditPanel ( )) ;
// 색상 선택 패널 만들기
JPanel panelCenter = new JPanel ( ) ;
colorChooser = new JColorChooser ( ) ;
colorChooser . getSelectionModel ( ) . addChangeListener ( this ) ;
panelCenter . add ( colorChooser ) ;
//하부 패널(코드 출력 버튼) 생성
JPanel panelSouth = new JPanel ( ) ;
panelSouth . add ( outputButton = new JButton ( ′ コード 出力 ′ )) ;
outputButton . addActionListener ( this ) ;
// 상부 패널과 하부 패널을 프레임에 추가
getContentPane ( ) . setLayout ( new BorderLayout ( )) ;
getContentPane ( ) . add ( panelNorth , BorderLayout . NORTH ) ;
getContentPane ( ) . add ( panelCenter , BorderLayout . CENTER ) ;
getContentPane ( ) . add ( panelSouth , BorderLayout . SOUTH ) ;
} 우선 기초가 되는 JFrame의 콘텐츠 레이아웃을 Border Layout으로 설정하고 NORTH(′북′ 즉 위), CENTER(중앙), SOUTH(′남′ 즉 아래) 각각에 JPanel을 배치합니다.이를 통해 크게 3개의 패널이 어플리케이션에 배치됩니다.중앙 패널에는 색상 선택용 J Color Chooser를 하나, 아래 패널에는 코드 출력용 J Button을 하나 배치하기만 하면 되기 때문에 특별히 어려운 점은 없습니다.위쪽 패널은 레이아웃을 Flow Layout으로 하고 좌측에 렌더링 결과를 표시하는 3D캔버스(create Canvas 메서드로 작성)를, 우측에는 파라미터를 변경하기 위한 버튼과 스크롤바를 배치한 다른 패널(create Param Edit Panel 메서드로 작성)을 배치하고 있습니다.파라미터 편집용 패널은 다음과 같이 Grid Layout을 이용해 6행 2열의 부품을 배치합니다.gridlayoutを使用した部品の配置
전용 JPanel createParamEditPanel() {
JPanel 패널 = 새 JPanel();
패널.기본 설정 크기(새 치수(300, Render_CANVAS_SIZE));
패널.레이아웃 설정(새 그리드 레이아웃(6, 2, 10, 5));
(inti = 0, i = 6; i++) {에 대해
// ラベルの追加
panel.add(paramNameLabels[i]
= 새 JLabel(labelNames[i]), JLabel.오른쪽);
if(i < 4) {
// ボタンの追加
파라미터 버튼[i] = 새 JB 버튼();
panel.add(paramButtons[i]);
param 버튼 [i]add Action Listener(이것);
} 기타 {
// スクロールバーの追加
intbarIndex = i - 4;
paramScrollBars[barIndex]
= 새 JScrollBar(JScrollBar).수평, 0, 1, 0, 100);
paramScrollBars[barIndex]를 선택합니다.Add Adjustment Listener(이것);
panel.add(paramScrollBars[barIndex]);
}
}
리턴 패널;
}{경계선 배치}{흐름 배치}{그리드 배치}{{자바}}{{{{{{{{}}}}}{{{{{{{{{{{{{{{}}}}}}}}{{{{{{{{{{}}}}}}}}}}}}api仕様書を見ると、それぞれのレイアウト方法の特徴を理解できるでしょう。borderlayout
플로우 레이아웃
gridlayoutアプリケーションのインターフェース色の編集は画面中央のjcolorchooserを利用した色選択パネルで行います。jcolorchooserは非常に便利なクラスで、色を選択するために次の3通りの方法を提供します。ユーザーはそれぞれから好きな方法で色を選択できます。サンプルカラーからの選択
hsb値の指定
rgb値の指定ここで選択する色は、ambient(環境光)、diffuse(拡散光)、specular(鏡面光)、emission(放射光)の4つの光の色の1つに反映されます。対象となる光は、右上のラベルが青い四角の枠で囲まれています(起とtransparency(透明度)はスクロールバーで変更します。どちらも右に行くほど値が大きくなります。java3dを用いてレンダリング結果を表示するキャンバス3dオブジェクトを表示するためのキャンバスがcanvas3dクラスです。java3D→→캔버스3dオブジェクトを作成し、simpleuniverseクラスのコンストラクタに渡します。その後、simpleuniverseクラスのaddbranchgraphメソッドを使用して3d要素を追加します。canvas3dオブジェクトの作成は、次のように行っています。canvas3dの作成
개인 Canvas 3D CreateCanvas() {
그래픽 구성 구성
= SimpleUniverse.getPreferred Configuration();
Canvas 3D 캔버스 = 새 Canvas 3D(config);
캔버스.setSize(RENDER_CANVAS_)크기, Render_CANVAS_SIZE);
단순한 우주 = 새로운 단순한 우주(캔버스);
universe.getViewingPlatform().setNomalViewTransform();
universe.add BranchGraph(지점 그래프 만들기());
캔버스 반환;
}今回はcreatebranchgraphメソッドで、球体を1つ表示するだけの簡単なシーンを作成します。このシーンを表すbranchgroupには、次の要素を追加します。平行光源(lightオブジェクト):右斜め上から球体を照らす白色光源
環境光(lightオブジェクト):球体全体を均一に照らす光源
背景イメージ(backgroundオブジェクト):球体の透明度を識別するために追加する黒と白のチェック柄のイメージ
球体(sphereオブジェクト):材質の設定結果を確認するための球体次のコードようにbranchgroupオブジェクトのaddchildメソッドを使用して、これらの要素を登録します。canvas3dとbranchgroupの追加
전용 BranchGroup createBranchGraph() {
분기 그룹 분기 그룹 = 새 분기 그룹();
// 平行光源の追加
branchGroup.addChild(createDirectionalLight());
// 環境光の追加
branchGroup.addChild(createAbientLight();
//背景イメージの追加
branchGroup.addChild(createBackgroundImage();
// レンダリング対象の球体を追加
branchGroup.addChild(CreateSphere());
branchGroup.compile();
branchGroup 반환;
}sphereオブジェクトの作成java3dに準備されているsphereクラスを使用することで、簡単に球体の3dモデルを作成できます。sphereクラスには6種類ものコンストラクタがありますが、今回は半径、法線の設定の指定、分割数(値が大きいほど滑ら
sphere(float radius, int primflags, int divisions, appearance ap) ここで指定するappearanceが、ambient(環境光)などに関係するmaterialと、transparency(透明度)に関係するtransparencyattributesを保持します。つまり、sphereオブジェクトを作成する前に、容がわかると思います。sphereオブジェクトの作成
개인 구 작성구() {
// 재료 の // // //
재료 재료 = 새 재료();
물질적인.공정 능력 설정(재료).ALLOW_COMPONENT_READ);
물질적인.공정 능력 설정(재료).허용_구성 요소_쓰기);
물질적인.setLightingEnable(true);
// 투명도 속성 ▲▲▲▼
투명도 속성 투명도 = 새로운 것
투명 특성(투명 속성).혼합, 0.0f);
투명도
.setCapability(투명 속성)를 선택합니다.ALLOW_VALUE_READ );
투명도
.setCapability(투명 속성)를 선택합니다.허용_VALUE_WRITE );
// 외관 → → → → → →
m_배경 = 새로운 모습();
m_complacement.기능 설정(외관).허용_Material_READ);
m_complacement.기능 설정(외관).허용_재료_쓰기);
m_complacement.기능 설정(
외모.ALLOW_TRANSPANCE_ATRICTUES_READ);
m_complacement.기능 설정(
외모.허용_TRANSPANCY_Attributes_WRITE);
// 외관 → 재료 → → → → →
m_complacement.재료(재료) 세트;
// 외관 → 투명 속성 → → → →
m_등장.투명 속성 설정(투명도);
// 구 の の の面
구면 = 새로 만들기
구(0.7f, 구)GENERATE_NORMALS, 128, m_외관);
sphere.getShape().setCapability(Shape3D).허용_외관_쓰기);
sphere.getShape().setCapability(Shape3D).허용_외관_읽기);
반환 구;
}材質設定用のコードを出力する各パラメータを変更してレンダリング結果の変化を見るだけでも楽しいですが、せっかくなのでここで編集した材質をjava3dを用いたプログラムで使用できるように、javaのコードを出力する機能を追加してみます。今回は、アプリケーションの下の方にある「コード出力」ボタンを押すと次のようなフレームが現れ、テキストエリアにコcボタンでクリップボードにコピーすれば、任意のテキストエディタにコピーすることができます。コードの出力は、テキストエリアに値を書き出すだけですので大したことは行っていませんが、decimalformatクラスを使
소수 형식 형식 = 새 소수 형식(′0.0000′);このコンストラクタで作成したオブジェクトのformatメソッドを使用すると、指定したフォーマットで値を文字列に変換できます。今回はjava言語で材質を設定するためのコードを出力するようにしましたが、必要に応じて材質を設定するコードの出力
사설 void 출력 코드() {
재료 재료 = m_외관. 재료 가져오기();
색상 3f 색상 = 새 색상 3f();
J프레임 프레임 = 새 J프레임(′코드′);
틀에 끼우다.setBounds(100, 100, 500, 250);
JTextArea 텍스트 영역 = 새 JTextArea();
텍스트 영역.SetLineWrap(참);
소수 형식 형식 = 새 소수 형식(′0.0000′);
textArea.adpend(′재료 = 새 재료();′);
재료.주변 색상(색상)을 구합니다;
textArea.adpend(′자료).주변 색상 설정(′
+ form.format(color.x) + ′f, ′
+ form.format(color.y) + ′f, ′
+ form.format(color.z) + ′f′;′);
// (中略)
frame.add(textArea);
틀에 끼우다.표시 가능(참) 설정;
}
반응형