자바의 3D 그래픽 프로그래밍, Part 1 : Java 3D

진정한 Java 플랫폼을 구축하기 위해 Sun은 초기에 Java 1.0 코어 플랫폼에서 사용할 수있는 제한된 기능을 넘어서 API 그림을 작성해야한다는 것을 깨달았습니다. 썬은 1.1과 임박한 1.2 릴리스를 통해 코어를 크게 성장 시켰지만 여전히 Java 퍼즐에서 빠진 부분이 있습니다.

Sun과 파트너는 누락 된 멀티미디어 프로그래밍 부분을 제공하기 위해 Java Media and Communication API를 개발했습니다. 가장 큰 두 부분 인 2D 및 3D 그래픽은 각각 Java 2D 및 3D API를 대상으로합니다. Java 2D는 Java 1.2로 시작하는 핵심 플랫폼 API이며 Java 3D는 1.2 플랫폼이 출시 된 직후 Extension API로 출시 될 예정입니다. 최근 Java 2D에 대한 일련의 칼럼을 마쳤습니다. 이제 Java 3D로주의를 돌립니다.

Java 3D는 Java 개발자가 사용자에게 3 차원 대화 형 콘텐츠를 제공하는 애플릿 및 응용 프로그램을 작성할 수있는 기능을 제공합니다. 썬은이 분야에서 다른 3D 그래픽 기술과 치열한 경쟁을 벌이고 있으며, 자바 3D는 기존 그래픽 표준 인 OpenGL을 무너 뜨리기 위해 앞장서고 있습니다.

Java 용 3D 그래픽 API에 대한 독자 의견 요청은 Java 3D 및 Java OpenGL 바인딩에 심각한 관심을 나타 냈으므로 앞으로 몇 달 동안 이러한 기술에 집중하기로 결정했습니다.

더 제한된 양의 관심이 VRML로 표현되었습니다. 따라서 VRML97 콘텐츠 로더 및 Sun의 Java 3D VRML97 브라우저를 사용하여 Java 3D에서 VRML의 사용을 시연하여 VRML을 다룰 것입니다. Direct3D는 거의 관심을받지 않았기 때문에 다른 기술 중 하나가 지원하거나 상호 운용 할 수있는 곳을 언급하는 것을 제외하고는이 경로를 추구하지 않기로 결정했습니다.

Java 3D의 장단점

이번 달에는 Java 3D를 탐색하여 Java 용 3D 그래픽 API 둘러보기를 시작합니다. 먼저 API의 주요 강점과 약점에 대해 설명하겠습니다. 3D 그래픽은 때때로 다소 둔화되어 설명하기 어려울 수 있습니다. 저의 예나 설명에 대해 혼란 스러울 경우 언제든지 질문이나 의견을 적어 주시면 최선을 다해 해결하겠습니다.

Java 3D의 판매 포인트 :

  • 3D 그래픽에 대한 높은 수준의 객체 지향보기를 제공합니다. Java 3D는 장면 그래프 기반 3D 그래픽 모델 을 사용하여 부분적으로이를 수행 합니다. (이 개념은 기사 뒷부분에서 자세히 설명합니다.)이 접근 방식은 그래픽이나 멀티미디어 프로그래밍 경험이 많지 않은 프로그래머가 응용 프로그램에서 3D를 사용할 수 있도록 돕기위한 것입니다. 가능한 최고의 속도로 최적화하고 프로그래머에게 렌더링 프로세스를 최대한 제어 할 수 있도록 설계된 OpenGL과 같은 하위 수준의 절차 적 3D API와는 완전히 대조적으로 Java 3D는 숙련 된 Java 프로그래머가 배우다.

  • 렌더링 작업에 대한 낮은 수준의 액세스가 필요하지 않은 경우 Java 3D가 옵션 일 수 있습니다. 렌더링 액세스는 Java 2D의 렌더링 힌트와 형식 및 기능이 유사한 속성기능 비트 를 통한 요청으로 제한됩니다 . (2D 렌더링 힌트에 대한 토론과 예제가 포함 된 Java 2D에 대한 이전 시리즈에 대한 링크는 참고 자료를 참조하십시오.)

  • Java 3D는 가능한 경우 속도에 최적화되어 있습니다. 실제로 런타임은 렌더링 기능 비트를 사용하여 가능한 가장 빠른 렌더링을 위해 장면 그래프를 최적화합니다. 이 접근 방식은 Java 3D를 오프라인 고품질 그래픽 애플리케이션 (예 : 렌더 팜)보다 대화 형 그래픽 환경 (게임, 시뮬레이션, 저 지연 상황)에 더 적합하게 만듭니다.

  • 컨텐츠를 Java 3D 런타임으로 가져 오는 데 점점 더 많은 3D 로더를 사용할 수 있습니다. 썬은 자바 3D VRML97 파일 로더와 브라우저를 코드와 함께 자유롭게 사용할 수 있도록 만들었습니다. Java 3D 로더에 대해 자세히 알아 보려면 다음 달의 미디어 프로그래밍 칼럼을 참조하십시오.

  • Java 3D에는 Java 플랫폼의 다른 곳에서는 사용할 수없는 벡터 수학 기능이 필요합니다. 이러한 수학 연산은 현재 javax.vecmath패키지에 있으며 향후 핵심 플랫폼으로 이동할 수 있습니다.

  • Java 3D는 여러 가지 이국적인 장치 (예 : 지팡이, 데이터 장갑 및 헤드셋)를 지원합니다. com.sun.j3d.utils.trackersSun 구현에 포함 된 패키지는 Fakespace, Logitech 및 Polhemus 장치에 대한 클래스를 제공합니다. 그러나 이러한 장치는 널리 사용되지 않으므로 자세히 설명하지 않겠습니다. 장치 지원에 대해 자세히 알아 보려면 Sun의 Java 3D 사이트 및 Java 3D 메일 링리스트 아카이브 (둘 다 아래 리소스에 포함 된 주요 Sun Java 3D URL에서 사용 가능)를 참조하십시오.

Java 3D에는 많은 장점이 있지만 단점은 어떻습니까? 여기에는 다음이 포함됩니다.

  • Java 3D는 표준 확장 API입니다. Java 플랫폼 사용권자는 원하는 경우 API를 구현할 수있는 옵션이 제공되지만 반드시 구현할 필요는 없습니다. 표준 확장으로서의 Java 3D의 포지셔닝은 플랫폼간에 Java 3D 코드의 이식성을 감소시킬 위험이 있습니다. 대부분의 공급 업체는 핵심 플랫폼에 대한 변경 및 추가 사항을 따라 잡기 위해 노력해야합니다.

  • Java 3D에는 심각한 가용성 제약이 있습니다. 이는 확장 API로서의 Java 3D 상태의 결과입니다. 현재 Java 3D 구현을 제공하는 유일한 주요 공급 업체는 Solaris 및 Win32 용 구현을 포함하는 Sun입니다. Unix, Windows 및 기타 여러 운영 체제의 모든 버전에서 사용할 수있는 OpenGL과 비교할 때 Java 3D 코드의 플랫폼 간 이식성은 의심스러워 보입니다.

  • 소프트웨어 가용성 문제와 함께 문서 결함이 발생합니다. Sun은 Java 3D에 대한 개발자 교육 및 지원을 제공하기 위해 용감한 노력을 기울이고 있지만 OpenGL과 그 사용을 문서화하는 업계의 나머지 노력에 비해 여전히 부족합니다. OpenGL Consortium의 웹 사이트는 지금까지 Sun이 Java 3D를 위해 통합 한 것보다 훨씬 깊고 광범위합니다. 이것은 사소한 점이 아닙니다. 3D 그래픽 API의 상대적 복잡성으로 인해 좋은 문서화가 필요합니다.

  • Java 3D는 개발자에게 렌더링 파이프 라인 세부 정보를 숨 깁니다. Java 3D는 고수준 API이기 때문에 의도적으로 개발자에게 렌더링 파이프 라인의 세부 정보를 숨기므로 이러한 세부 정보가 중요한 많은 문제에 적합하지 않습니다. (이 3D 시리즈 후반부에서 OpenGL의 하위 수준 모델과 렌더링 파이프 라인에 대한 액세스에 대해 설명합니다.)

  • Java 3D 구성 요소는 무겁습니다. 즉, 실제로 렌더링을 수행하는 네이티브 (자바가 아닌) 피어가 있습니다. 이는 Java Swing과 전체 Java 또는 경량 구성 요소를 사용하는 경우 GUI 개발을 복잡하게 만들 수 있습니다. 몇 가지 특별한 해결 방법이 있지만 일반적으로 가볍고 무거운 구성 요소는 동일한 컨테이너 개체 및 창에서 잘 섞이지 않습니다. 경량-무거운 구성 요소 문제에 대한 자세한 내용은이 기사 끝에있는 리소스에서 확인할 수 있습니다.

Java 3D 설치

이제 Java 3D의 주요 기능과 제약 사항을 이해 했으므로 몇 가지 예제 코드를 사용해 볼 준비를하겠습니다.

Java 3D는 Win32 및 Solaris 용 베타 버전으로 제공됩니다. Sun의 Java 3D 구현 중 더 성숙한 것은 OpenGL을 기반으로 구축되었습니다. 알파 품질의 Direct3D 구현도 Win32에 사용할 수 있습니다. Java 1.2 베타 4에 해당하는 최신 Java 3D 베타와 함께 Java 1.2가 모두 필요합니다. Sun은 현재 1998 년 12 월로 예정된 Java 1.2를 출시 한 직후에 최종 Java 3D 구현을 출시하겠다고 약속했습니다.

약간 혼란스러운 점을 제외하면 Sun은 Java 3D 1.0 API에 해당하는 Java 3D 1.0 알파 구현을 출시했지만 1.0 API에 대해 알파 이외의 것은 출시하지 않았습니다. 그런 다음 Sun은 API를 수정하여 수정 된 버전을 Java 3D 1.1 API로 출시했습니다. 이 버전에 이어 1.1 베타 구현 (지금까지 2 개)이 출시되었습니다. Sun은 Java 1.2 플랫폼의 최종 릴리스 직후에 최종 API 및 구현을 릴리스하겠다고 약속했습니다. 바라건대, API가 안정화되었으며 아직 다시는 개선되지 않을 것입니다. 세계는 여전히 최종 구현 버전을 기다리고 있습니다.

향후 칼럼에서 Java OpenGL 바인딩을 다룰 것이므로이 설치 지침에서도 Java 3D의 OpenGL 버전을 절약하고 사용하기로 결정했습니다. 이러한 Java 3D 예제와 함께 사용할 OpenGL 버전을 설치하면 나중에 Java-OpenGL 예제에 필요한 렌더링 라이브러리가 제공됩니다.

Java 3D를 사용하는 데 필요한 소프트웨어 구성 요소는 다음과 같습니다.

  • Sun에서 제공하는 Java 3D 런타임 (무료 Java Developer Connection 로그인 필요). 플랫폼에 맞는 OpenGL 버전의 Java 3D를 선택하십시오 (Win32를 사용하고 있습니다). 현재 OpenGL 용 최신 Win32 Java 3D는 java3d11-beta2-win32-opengl.exe에서 1.1 베타 2이며 무게는 약 1.7MB입니다.

  • Windows NT 4.0 및 Windows 95 OSR 2와 함께 번들로 제공되는 OpenGL 1.1. Windows 95의 OSR 1 릴리스가있는 경우 OpenGL 지원을 다운로드 할 수 있습니다. 최신 Windows 95-OpenGL 1.1 구현은 Microsoft에서 opengl95.exe로 구할 수 있으며 약 0.5MB입니다.

  • Sun에서 사용할 수있는 Java 1.2. (이 글을 쓰는 동안 Sun은 새로운 Java 1.2-Release Candidate 1을 출시했습니다. 예제는 가능한 한 빨리 최신 릴리스로 업데이트 될 것입니다.) Java 3D는 1.2 플랫폼에 결합되었으며 Sun은 API를 분리하고 이전 플랫폼 릴리스에서 사용할 수 있도록 시도하는 데 관심이없는 java3d-interest 메일 링리스트.

선택적으로 Java 3D 문서 및 예제 코드를 다운로드 할 수도 있습니다. 둘 다 Java 3D 런타임과 동일한 링크에서 사용할 수 있습니다.

Java 또는 appletviewer 실행 파일이 확장 라이브러리를 찾기 위해 더 이상 CLASSPATH 환경 변수를 설정할 필요가 없습니다. Java 1.2를 통해 Sun은 마침내 표준 확장 디렉토리를 만들었습니다. 이 디렉토리는 JDK 설치 디렉토리 내의 / jre / lib / ext /에 있습니다. 예를 들어, 내 시스템에서 Java 1.2 Beta 4는 다음 위치에 설치됩니다.

C:\jdk1.2beta4\

표준 확장 디렉토리는 다음 위치에 있습니다.

C:\jdk1.2beta4\jre\lib\ext\

모든 확장 라이브러리는 설치시 jar 아카이브를이 확장 디렉토리에 배치해야하며 모든 표준 JDK 도구는 여기에서 필요한 클래스 파일을 검색하는 것을 알고 있습니다.

Sun의 Java 3D의 경우 이러한 아카이브에는 공용 (Java 3D API 사양에 문서화 됨) 및 개인 (Sun 구현 별) 클래스가 모두 포함됩니다. 공개 수업 자료실에는 다음이 포함됩니다.

  • j3dcore.jar-공용 Java 3D 패키지 용 클래스 파일이 들어 있습니다 javax.media.j3d.

  • vecmath.jar-에 대한 클래스가 포함되어 있습니다 javax.vecmath.

개인 아카이브에는 다음이 포함됩니다.

  • j3daudio.jarcom.sun.j3d.audio-Java 1.2에서 데뷔 한 헤드 스페이스 기반 오디오 엔진 인 Java Sound의 Java 부분의 사용자 정의 사본 위에 공간화 된 오디오에 대한 지원을 빌드 하는 클래스를 아카이브합니다 .

  • j3dutils.jar-다양한 Sun 유틸리티 클래스를 총 16 개의 패키지와 그 아래에있는 하위 패키지로 캡슐화합니다 com.sun.j3d. 다음 달의 Java 3D 토론에서이 패키지에 대해 자세히 살펴 보겠습니다.

  • j3dutilscontrib.jar-다른 사람들이 Sun의 노력에 기여한 유용한 유틸리티를 보관합니다. 위에서 언급 한 코드를 com.sun.j3d포함하여 계층 구조 아래에 7 개의 패키지가 있습니다 com.sun.j3d.utils.trackers. 다시 말하지만, 다음 달 칼럼은이 병의 패키지에 대한 더 많은 정보를 제공 할 것입니다.

이론적 으로는와 같은 비표준 패키지에서 제공되는 모든 클래스에서 메서드를 인스턴스화하고 호출 할 수 있습니다 com.sun. 그러나 주의 사항 : 코드가 실행되는 플랫폼에서 사용할 수 있다는 보장은 없습니다. 현재 Java 3D는 Sun에서만 사용할 수 있으므로 실제로 많은 개발자가 Sun의 개인 아카이브 내의 클래스를 사용합니다. 그렇게하도록 선택하는 데 수반되는 잠재적 인 이식성 절충을 알고 있어야합니다.

공개 및 비공개 Java 3D 클래스가 시스템 리소스와 상호 작용하는 방식에도 마술은 없습니다. 썬은 네이티브 라이브러리를 설치 J3D.dll하고 j3daudio.dll세 이하 /jre/bin/디렉토리. Java 3D 클래스는 네이티브 메서드를 사용하여 이러한 DLL을 호출하고 Win32 플랫폼 및 OpenGL 렌더링 라이브러리와 인터페이스합니다. (Solaris 구현을위한 유사한 라이브러리가 있습니다.)

설치에 대한 마지막 참고 사항 : OpenGL 렌더링 파이프 라인은 OpenGL 가속 하드웨어를 활용하여 그래픽 응용 프로그램의 속도를 높이도록 설계되었습니다. 그러나이 칼럼의 목적을 위해 특별한 하드웨어없이 예제를 실험 할 수 있어야합니다. (사실 저는 OpenGL 가속 하드웨어가없는 Pentium 150-MHz MMX 랩탑에서 모든 예제를 개발하고 있습니다.) 가속 카드에 관심이 있다면 OpenGL 웹 사이트 또는 Java 3D 메일 링리스트 ( 자세한 내용은 참고 자료 참조). 가속 하드웨어에 대한 다음 달의 Java 3D 칼럼에도 좀 더 많은 정보를 포함 할 계획입니다.

장면의 뷰 브랜치 구성

앞서 언급했듯이 장면 그래프 그래픽 모델 의 가장 큰 강점 중 하나 는 경험이없는 그래픽 프로그래머가 응용 프로그램에 3D를 추가 할 수 있다는 것입니다. 전통적으로 3D 프로그래머는 개별 선 또는 기타 그래픽 프리미티브를 그릴 위치와 방법을 지정해야했습니다. 그러나 장면 그래프를 사용하여 프로그래머는 렌더링 할 객체를 나타내는 노드와 렌더링 지침 (예 : 모니터에 표시되는 시점이있는 위치, 프로그래머 인 3D 세계의 물리적 기하학)을 포함하는 나무와 같은 구조를 만듭니다. 생성하고 사물 간의 상대적 거리).