zSpace, Inc. · OTC:ZSPC
zSpace — Technical Presentation (September 2012)
26 slides from zSpace's technical presentation, September 2012
Slide 1: How to Develop Virtual Reality Applications in zSpace – Part II
How to Develop Virtual Reality Applications in zSpace – Part II CONFIDENTIAL | © 2012 Infinite Z, Inc. | All Rights Reserved
Slide 2: Agenda
Agenda • Review • System Requirements • Enabling Stereo • Head Tracking • Stylus Tracking • Direct Interaction • Questions
Slide 3: Review
Review Direct interaction with 3D virtual-holographic simulations in open space Full color, high resolution Passive, polarized stereoscopic display tracking eyewear Unique stylus Innovative software for 3D interaction development platform
Slide 4: System Requirements
System Requirements • Windows 7 or XP, 32bit or 64bit • Microsoft Visual Studio 2008 SP1, 2010 • Stereo Enabled GPU – Pro only (nVidia Quadro or AMD FirePro) • SDK is a collection of C++ classes – Simplified C interface in 2.7
Slide 5: Application Steps
Application Steps • Stereo Enabled Rendering • Use zSpace Stereo Data • Enable Head Tracking • Read Stylus • Direct Interaction
Slide 6: Setting The Pixel Format
Enabling Stereo Setting The Pixel Format // Obtain a device context for the window m_hDc = GetDC(m_hWnd); // Set an appropriate pixel format PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_STEREO | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 24, 0,
Slide 7: Setting Up the zSpace Stereo Objects
Enabling Stereo Setting Up the zSpace Stereo Objects // Create the stereo window. m_stereoWindow = new StereoWindow(windowX, windowY, windowWidth, windowHeight); // Do left/right frame detect StereoLeftRightDetect::initialize(m_stereoWindow, StereoLeftRightDetect::WINDOW_TYPE_GL); // Create a viewpo
Slide 8: Setting Up the zSpace Stereo Objects
Enabling Stereo Setting Up the zSpace Stereo Objects // Create the stereo window. m_stereoWindow = new StereoWindow(windowX, windowY, windowWidth, windowHeight); // Do left/right frame detect StereoLeftRightDetect::initialize(m_stereoWindow, StereoLeftRightDetect::WINDOW_TYPE_GL); // Create a viewpo
Slide 9: Stereo 3D Rendering
Enabling Stereo Stereo 3D Rendering Clear Back Buffers Position Left Left Back Right Back Camera Buffer Buffer Render Scene Position Right Left Front Right Front Camera Buffer Buffer Render Scene To Display Swap Buffer
Slide 10: The Stereo Render Loop
Enabling Stereo The Stereo Render Loop // The main render loop while (m_done == false) { renderEye(StereoFrustum::STEREO_EYE_LEFT); renderEye(StereoFrustum::STEREO_EYE_RIGHT); SwapBuffers(m_hDc); } // This happens for each eye void renderEye(StereoFrustum::StereoEye eye) { setupMatrices(eye); if (ey
Slide 11: The Stereo Render Loop
Enabling Stereo The Stereo Render Loop // The main render loop while (m_done == false) { renderEye(StereoFrustum::STEREO_EYE_LEFT); renderEye(StereoFrustum::STEREO_EYE_RIGHT); SwapBuffers(m_hDc); } // This happens for each eye void renderEye(StereoFrustum::StereoEye eye) { setupMatrices(eye); if (ey
Slide 12: Application Steps
Application Steps • Stereo Enabled Rendering • Use zSpace Stereo Data • Enable Head Tracking • Read Stylus • Direct Interaction
Slide 13: Adjusting The Left and Right Cameras
Enabling Stereo Adjusting The Left 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->g
Slide 14: Adjusting The Left and Right Cameras
Enabling Stereo Adjusting The Left 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->g
Slide 15: Setting The Off-Axis Projections
Enabling Stereo Setting The Off-Axis Projections GLfloat projectionMatrixGl[16]; // Set the projection matrix for eye. Matrix4 projectionMatrix4; stereoFrustum->getProjectionMatrix(eye, projectionMatrix4); MathConverterGl::convertMatrix4ToMatrixGl(projectionMatrix4,projectionMatrixGl); glMatrixMode(
Slide 16: Setting The Off-Axis Projections
Enabling Stereo Setting The Off-Axis Projections GLfloat projectionMatrixGl[16]; // Set the projection matrix for eye. Matrix4 projectionMatrix4; stereoFrustum->getProjectionMatrix(eye, projectionMatrix4); MathConverterGl::convertMatrix4ToMatrixGl(projectionMatrix4,projectionMatrixGl); glMatrixMode(
Slide 17: Application Steps
Application Steps • Stereo Enabled Rendering • Use zSpace Stereo Data • Enable Head Tracking • Read Stylus • Direct Interaction
Slide 18: Head Tracking
Head Tracking Initialize Tracking // Initialize 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_tra
Slide 19: Application Steps
Application Steps • Stereo Enabled Rendering • Use zSpace Stereo Data • Enable Head Tracking • Read Stylus • Direct Interaction
Slide 20: Stylus Tracking
Stylus Tracking 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 trackerSp
Slide 21: Windowed Mode
Windowed Mode Tracking Window Size and Position // Assuming that the viewport is tracking the window m_stereoWindow->move(x, y); m_stereoWindow->resize(width, height); Getting the Stylus Offset Vector3 viewportOffset = Vector3::ZERO(); const zspace::common::DisplayInfo::Display* display = m_stereoWi
Slide 22: Windowed Mode
Windowed Mode Tracking Window Size and Position // Assuming that the viewport is tracking the window m_stereoWindow->move(x, y); m_stereoWindow->resize(width, height); Getting the Stylus Offset Vector3 viewportOffset = Vector3::ZERO(); const zspace::common::DisplayInfo::Display* display = m_stereoWi
Slide 23: Application Steps
Application Steps • Stereo Enabled Rendering • Use zSpace Stereo Data • Enable Head Tracking • Read Stylus • Direct Interaction
Slide 24: Direct Interaction
Direct Interaction Interpreting a Pose Vector3 posePosition = Vector3::ZERO(); Vector3 poseX = Vector3::UNIT_X(); Vector3 poseY = Vector3::UNIT_Y(); Vector3 poseZ = Vector3::UNIT_Z(); Matrix4 primaryWorldPose; // Get the position of the pose posePosition = primaryWorldPose.getTrans(); // Get the X,
Slide 25: Direct Interaction: Mouse Emulation
Direct Interaction Mouse Emulation // Get the tracker mouse simulator TrackerMouseSimulator* trackerMouseSimulator = m_trackerSystem->getTrackerMouseSimulator(); // Set the tracker target to use TrackerTarget* primaryTarget = m_trackerSystem->getDefaultTrackerTarget(TrackerTarget::TYPE_PRIMARY); tra
Slide 26: Questions
Questions Transforming computer interaction lifelike | interactive | immersive zSpace: Direct interaction with 3D virtual-holographic simulations in open space - Full color, high resolution stereoscopic display - Unique stylus for 3D interaction - Passive, polarized tracking eyewear - Innovative sof