zSpace: An Integrated Immersive Stereoscopic 3D System - - PowerPoint PPT Presentation
zSpace: An Integrated Immersive Stereoscopic 3D System - - PowerPoint PPT Presentation
zSpace: An Integrated Immersive Stereoscopic 3D System Doug Twilleager zSpace So1ware CTO Agenda zView zSpace Overview System Requirements
Agenda ¡ ¡
- zView ¡
- zSpace ¡Overview ¡
- System ¡Requirements ¡
- SDK ¡Architecture ¡
- Using ¡zSpace ¡Stereo ¡
- Enabling ¡Head ¡Tracking ¡
- Coordinate ¡System ¡Overview ¡
- Enabling ¡the ¡Stylus ¡
- Future ¡DirecGons ¡
Direct ¡interacGon ¡with ¡3D ¡virtual-‑holographic ¡ simulaGons ¡in ¡open ¡space ¡
InnovaGve ¡so1ware ¡ ¡ development ¡plaKorm ¡ Full ¡color, ¡high ¡resoluGon ¡ stereoscopic ¡display ¡ Passive, ¡polarized ¡ ¡ tracking ¡eyewear ¡ Unique ¡stylus ¡ for ¡3D ¡interacGon ¡
zSpace ¡Overview ¡
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 ¡
ApplicaGon ¡Rendering ¡ zSpace ¡ Stereo ¡ zSpace ¡Display ¡ GPU ¡ zSpace ¡ Tracking ¡ ApplicaGon ¡Logic ¡
zSpace ¡SDK ¡
USB ¡ Video ¡
SDK ¡Architecture ¡
Using ¡zSpace ¡Stereo ¡
Far ¡Clip ¡ Near ¡Clip ¡ Screen ¡ Mono ¡View ¡
Using ¡zSpace ¡Stereo ¡
Far ¡Clip ¡ Near ¡Clip ¡ Screen ¡ Stereo ¡View ¡ NegaGve ¡ Parallax ¡ PosiGve ¡ Parallax ¡
Using ¡zSpace ¡Stereo ¡
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); ¡ ¡
AdjusGng ¡The ¡Le1 ¡and ¡Right ¡Cameras ¡
Using ¡zSpace ¡Stereo ¡
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); ¡
Serng ¡The ¡Off-‑Axis ¡ProjecGons ¡
Enabling ¡Head ¡Tracking ¡
Far ¡Clip ¡ Near ¡Clip ¡ Screen ¡ Stereo ¡View ¡ NegaGve ¡ Parallax ¡ PosiGve ¡ Parallax ¡
Enabling ¡Head ¡Tracking ¡
IniGalize ¡Tracking ¡
// ¡IniGalize ¡the ¡tracking ¡system ¡– ¡this ¡is ¡done ¡once ¡ m_trackerSystem ¡= ¡new ¡zspace::tracker::TrackerSystem(); ¡ ¡ // ¡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); ¡
Passing ¡Along ¡The ¡Head ¡Pose ¡
X ¡ Y ¡ Z ¡
Camera ¡Space ¡
Display ¡ Offset ¡ Display ¡ Angle ¡
Coordinate ¡System ¡Overview ¡
X ¡ Y ¡ Z ¡
Tracker ¡Space ¡
Display ¡ Offset ¡ Display ¡ Angle ¡
Coordinate ¡System ¡Overview ¡
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 ¡
- pen ¡space ¡
¡
- ‑ ¡Full ¡color, ¡high ¡resoluGon ¡stereoscopic ¡display ¡
- ‑ ¡Unique ¡stylus ¡ ¡for ¡3D ¡interacGon ¡
¡
- ‑ ¡Passive, ¡polarized ¡tracking ¡eyewear ¡
¡
- ‑ ¡InnovaGve ¡so1ware ¡development ¡plaKorm ¡
¡ ¡