zSpace: ¡An ¡Integrated ¡Immersive ¡ Stereoscopic ¡3D ¡System ¡ ¡ Doug ¡Twilleager ¡ zSpace ¡So1ware ¡CTO ¡
Agenda ¡ ¡ • zView ¡ • zSpace ¡Overview ¡ • System ¡Requirements ¡ • SDK ¡Architecture ¡ • Using ¡zSpace ¡Stereo ¡ • Enabling ¡Head ¡Tracking ¡ • Coordinate ¡System ¡Overview ¡ • Enabling ¡the ¡Stylus ¡ • Future ¡DirecGons ¡
zSpace ¡Overview ¡ Direct ¡interacGon ¡with ¡3D ¡virtual-‑holographic ¡ simulaGons ¡in ¡open ¡space ¡ Full ¡color, ¡high ¡resoluGon ¡ Passive, ¡polarized ¡ ¡ stereoscopic ¡display ¡ tracking ¡eyewear ¡ Unique ¡stylus ¡ InnovaGve ¡so1ware ¡ ¡ for ¡3D ¡interacGon ¡ development ¡plaKorm ¡
System ¡Requirements ¡ • Windows ¡7, ¡8, ¡or ¡XP, ¡32bit ¡or ¡64bit ¡ • Microso1 ¡Visual ¡Studio ¡2008 ¡SP1, ¡2010 ¡ • Stereo ¡Enabled ¡GPU ¡ – NVIDIA ¡Quadro ¡K4000 ¡ • SDK ¡is ¡a ¡collecGon ¡of ¡C++ ¡classes ¡ – Simplified ¡C ¡interface ¡in ¡2.7 ¡ • OpenGL ¡or ¡DirectX ¡ – NVAPI ¡Stereo ¡
SDK ¡Architecture ¡ ApplicaGon ¡Rendering ¡ ApplicaGon ¡Logic ¡ zSpace ¡SDK ¡ zSpace ¡ zSpace ¡ Stereo ¡ Tracking ¡ USB ¡ Video ¡ zSpace ¡Display ¡ GPU ¡
Using ¡zSpace ¡Stereo ¡ Mono ¡View ¡ Far ¡Clip ¡ Screen ¡ Near ¡Clip ¡
Using ¡zSpace ¡Stereo ¡ Stereo ¡View ¡ Far ¡Clip ¡ PosiGve ¡ Parallax ¡ Screen ¡ NegaGve ¡ Parallax ¡ Near ¡Clip ¡
Using ¡zSpace ¡Stereo ¡ AdjusGng ¡The ¡Le1 ¡and ¡Right ¡Cameras ¡ GLfloat ¡monoModelViewGl[16]; ¡ GLfloat ¡viewMatrixGl[16]; ¡ ¡ // ¡Copy ¡the ¡mono ¡model-‑view ¡matrix. ¡ glMatrixMode(GL_MODELVIEW); ¡ glGetFloatv(GL_MODELVIEW_MATRIX, ¡monoModelViewGl); ¡ ¡ // ¡Get ¡the ¡stereo ¡frustum. ¡ StereoFrustum* ¡stereoFrustum ¡= ¡m_stereoViewport-‑>getStereoFrustum(); ¡ ¡ // ¡Modify ¡the ¡model-‑view ¡matrix ¡for ¡eye. ¡ ¡ // ¡Note: ¡The ¡view ¡matrix ¡contains ¡eye ¡offset ¡plus ¡any ¡rotaGon ¡required ¡for ¡off-‑axis ¡projecGon. ¡ Matrix4 ¡viewMatrix4; ¡ stereoFrustum-‑>getViewMatrix(eye, ¡viewMatrix4); ¡ MathConverterGl::convertMatrix4ToMatrixGl(viewMatrix4, ¡viewMatrixGl); ¡ ¡ glLoadMatrixf(viewMatrixGl); ¡ glMultMatrixf(monoModelViewGl); ¡ ¡
Using ¡zSpace ¡Stereo ¡ Serng ¡The ¡Off-‑Axis ¡ProjecGons ¡ GLfloat ¡projecGonMatrixGl[16]; ¡ ¡ // ¡Set ¡the ¡projecGon ¡matrix ¡for ¡eye. ¡ Matrix4 ¡projecGonMatrix4; ¡ stereoFrustum-‑>getProjecGonMatrix(eye, ¡projecGonMatrix4); ¡ MathConverterGl::convertMatrix4ToMatrixGl(projecGonMatrix4,projecGonMatrixGl); ¡ ¡ glMatrixMode(GL_PROJECTION); ¡ glLoadMatrixf(projecGonMatrixGl); ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Alternate ¡Approach ¡ ¡ StereoFrustum::Bounds ¡bounds; ¡ ¡ // ¡Get ¡the ¡frustum ¡bounds ¡ bounds ¡= ¡stereoFrustum-‑>getBounds(eye); ¡ ¡ glMatrixMode(GL_PROJECTION); ¡ glFrustum(bounds.le1, ¡bounds.right, ¡bounds.boqom, ¡bounds.top, ¡bounds.nearClip, ¡bounds.farClip); ¡
Enabling ¡Head ¡Tracking ¡ Stereo ¡View ¡ Far ¡Clip ¡ PosiGve ¡ Parallax ¡ Screen ¡ NegaGve ¡ Parallax ¡ Near ¡Clip ¡
Enabling ¡Head ¡Tracking ¡ IniGalize ¡Tracking ¡ // ¡IniGalize ¡the ¡tracking ¡system ¡– ¡this ¡is ¡done ¡once ¡ m_trackerSystem ¡= ¡new ¡zspace::tracker::TrackerSystem(); ¡ ¡ Passing ¡Along ¡The ¡Head ¡Pose ¡ // ¡Cache ¡the ¡current ¡tracker ¡targets ¡ m_trackerSystem-‑>captureTargets(); ¡ ¡ // ¡Get ¡the ¡head ¡target ¡ TrackerTarget* ¡headTarget ¡= ¡m_trackerSystem-‑>getDefaultTrackerTarget(TrackerTarget::TYPE_HEAD); ¡ ¡ // ¡Get ¡the ¡head ¡pose ¡ Matrix4 ¡headPose ¡= ¡Matrix4::IDENTITY(); ¡ headTarget-‑>getPose(headPose); ¡ ¡ // ¡Set ¡the ¡stereo ¡head ¡pose ¡ StereoFrustum* ¡stereoFrustum ¡= ¡m_stereoViewport-‑>getStereoFrustum(); ¡ stereoFrustum-‑>setHeadPose(headPose); ¡
Coordinate ¡System ¡Overview ¡ Y ¡ Camera ¡Space ¡ X ¡ Z ¡ Display ¡ Offset ¡ Display ¡ Angle ¡
Coordinate ¡System ¡Overview ¡ Y ¡ Tracker ¡Space ¡ X ¡ Z ¡ Display ¡ Offset ¡ Display ¡ Angle ¡
Enabling ¡the ¡Stylus ¡ Read ¡Stylus ¡and ¡Convert ¡to ¡World ¡Space ¡ // ¡Get ¡the ¡stylus ¡target ¡ TrackerTarget* ¡primaryTarget ¡= ¡m_trackerSystem-‑>getDefaultTrackerTarget(TrackerTarget::TYPE_PRIMARY); ¡ ¡ // ¡Get ¡the ¡head ¡pose ¡ Matrix4 ¡primaryPose= ¡Matrix4::IDENTITY(); ¡ primaryTarget ¡-‑>getPose(primaryPose); ¡ ¡ Matrix4 ¡trackerSpaceToCameraSpace; ¡ Matrix4 ¡worldPrimaryPose; ¡ ¡ // ¡Get ¡the ¡display ¡for ¡this ¡window ¡ const ¡zspace::common::DisplayInfo::Display* ¡display ¡= ¡m_stereoWindow-‑>getCurrentDisplay(); ¡ ¡ // ¡Get ¡the ¡tracker ¡to ¡camera ¡space ¡transform ¡ trackerSpaceToCameraSpace ¡= ¡DisplayInfo::getTrackerToCameraSpaceTransform(display); ¡ ¡ // ¡Transform ¡the ¡pose ¡from ¡tracker ¡space ¡to ¡world ¡space ¡ worldPrimaryPose ¡= ¡cameraToWorldSpace ¡* ¡trackerSpaceToCameraSpace ¡* ¡primaryPose; ¡
Future ¡DirecGons ¡ • Stereo ¡ReprojecGon ¡ – NVIDIA ¡Nsight ¡ • OpGmizing ¡Rendering ¡ – Frustum ¡Culling ¡ – Shadow ¡Map ¡GeneraGon ¡ • MulGple ¡ProjecGon ¡Regions ¡ • Depth ¡of ¡Field ¡ • Grid ¡Rendering ¡(NVIDIA ¡GRID) ¡
zSpace ¡– ¡Booth ¡116 ¡ Transforming ¡computer ¡interacGon ¡ lifelike ¡ ¡| ¡ ¡interacGve ¡ ¡| ¡ ¡immersive ¡ ¡ zSpace: ¡Direct ¡interacGon ¡with ¡3D ¡virtual-‑holographic ¡simulaGons ¡in ¡ open ¡space ¡ ¡ -‑ ¡Full ¡color, ¡high ¡resoluGon ¡stereoscopic ¡display ¡ -‑ ¡Unique ¡stylus ¡ ¡for ¡3D ¡interacGon ¡ ¡ -‑ ¡Passive, ¡polarized ¡tracking ¡eyewear ¡ ¡ -‑ ¡InnovaGve ¡so1ware ¡development ¡plaKorm ¡ ¡ ¡
Recommend
More recommend