SlideShare une entreprise Scribd logo
1  sur  30
openFrameworks
      3D
3D

 ofNode     ofMesh   of3dUtils




ofCamera




ofEasyCam
ofCamera


Camera movement and matrices

• Extends from ofNode
• Basic GLUT camera functions
• Coordinate conversions
ofCamera


Frustum setup
                        angle of field of view in y direction, in degrees
     setFov(float)
                                            (45-60)

   setNearClip(float)             near clipping plane distance

   setFarClip(float)             set far clipping plane distance
ofCamera

Perspective and modelview matrices

        getProjectionMatrix()        Ortho / Perspective


       getModelViewMatrix()          Position/Orientation

   getModelViewProjectionMatrix()   Modelview * Projection
ofCamera


Coordinate conversion
    worldToScreen()      Convert openGL world to screen

    screenToWorld()        Convert screen to GL world

   worldToCamera()          Convert world to camera

   cameraToWorld()          Convert camera to world
ofCamera
               testApp.h




class testApp : public ofBaseApp{

 public:

 
      ...

 
      ofCamera cam;

 
};
ofCamera
                           testApp.cpp




void testApp::setup(){

 ofBackground(33,33,33);

 cam.setNearClip(0.1);

 cam.setFarClip(100);

    // "1 meter" to the right, "5 meters" away from object
    cam.setPosition(ofVec3f(1,0,5));
}




void testApp::draw(){

 cam.begin();

 
      glPointSize(10);

 
      glBegin(GL_POINTS);

 
      
   glVertex3f(0,0,0);

 
      glEnd();

 cam.end();
}
ofNode
ofNode

3D object container

• Standard 3D scene item
• Manage position, scale and orientation
• Lots of fantastic helper functions
• ofCamera extends from this class
ofNode


Movement
       truck()             Move left to right (x-axis)

      boom()              Move up and down (y-axis)

       dolly()        Move forward and backward (z-axis)

    setPosition()             Set position directly
ofNode

Rotation
         tilt()             Rotate around x-axis

         pan()              Rotate around y-axis

        dolly()             Rotate around z-axis

     rotate(a,axis)      Rotate around arbitrary axis
ofNode

Testing movement/orientation
                             Apply ofNode transformation (does a
     transformGL()
                                glPushMatrix/glMultMatrixf())

                         Does a glPopMatrix, call after transformGL and
  restoreTransformGL()
                                           drawing.

    resetTransform()          Resets the orientation and position
ofNode
void setScale(float s)

void setScale(float x, float y, float z)

void setScale(const ofVec3f& p)


void setPosition(float x, float y, float z)

void setPosition(const ofVec3f& p)

void setGlobalPosition(float x, float y, float z)

void setGlobalPosition(const ofVec3f& p)


void setOrientation(const ofQuaternion& q)

void setOrientation(const ofVec3f& eulerAngles)

void setGlobalOrientation(const ofQuaternion& q)
ofNode

Custom 3D nodes

• Create custom class and inherit from ofNode
• Implement virtual customDraw(void) member
  function.

• To draw, just call draw(void) on instance
ofNode
                Extend ofNode




class MyCustom3DNode : public ofNode {
public:

 virtual void customDraw() {

 
   ofSphere(0,0,0,0.7);

 
   ofDrawAxis(2
 );

 }
};
ofEasyCam


Camera interaction made easy

     begin()/end()       Put your draw calls between these

   setTarget(ofNode)        Follow and look at a target
ofEasyCam
        Custom ofNode - example ofEasyCam




class MyCustom3DNode : public ofNode {
public:

 virtual void customDraw() {

 
     ofSphere(0,0,0,0.7);

 
     ofDrawAxis(2);

 }
};

class testApp : public ofBaseApp{


    public:

    
    ofEasyCam easy_cam;

    
    vector<MyCustom3DNode*> custom_nodes;

    
    MyCustom3DNode* mover;
};
ofEasyCam
           Custom ofNode - example ofEasyCam



void testApp::setup(){

 ofBackground(33,33,33);


   // set distance of camera "5" meters away

   easy_cam.setDistance(5);


   // create a bunch of custom 3D nodes

   float r = 4;

   for(int i = 0; i < 10; ++i) {

   
     MyCustom3DNode* node = new MyCustom3DNode();

   
     node->setPosition(

   
     
    cos((float)i/10*TWO_PI) * r

   
     
    ,sin((float)i/10*TWO_PI) * r

   
     
    ,-5

   
     );

   
     custom_nodes.push_back(node);

   
     mover = node;

   }


   // set target for camera

   easy_cam.setTarget(*mover);
}
ofEasyCam
                   Custom ofNode - example ofEasyCam




void testApp::draw(){

 easy_cam.begin();

 
      // draw custom nodes.

 
      for(int i = 0; i < custom_nodes.size(); ++i) {

 
      
    custom_nodes[i]->draw();

 
      }

 

 
      // move over x-axis.

 
      float truck_amount = sin(ofGetElapsedTimef()*0.5) * 0.001;

 
      mover->truck(truck_amount);

 easy_cam.end();
}
ofMesh

Container for all vertex related data

•   Use this when working with 3D meshes. It creates a model that is used
    by openGL to draw 3D shapes.

•   Future proof (ready for modern openGL)

•   Clean API for most used data:
    add[Vertex,Color,TexCoord]()

•   Nice interface for writing 3D exports (OBJ, PLY)

•   Use this with Vertex Buffer Objects (VBO)
ofMesh
Adding vertices
          addVertex(ofVec3f)             Add one vertex

      addVertices(vector<ofVec3f>&)    Reference to ofVec3f
      addVertices(ofVec3f*, int num)    Pointer to vertices
          setVertex(int index)          Remove by index


Remove vertices
        removeVertex(int index)         Remove by index

            clearVertices()            Remove all vertices


Get vertex
             getVertex(int)              Get one vertex
ofMesh
Adding normals
         addNormal(ofVec3f&)             Add a normal

      addNormals(vector<ofVec3f>)    Add vector of normals
       addNormals(ofVec3f*, int)     Add array of normals
        setNormal(int, ofVec3f&)    Set one normal by index




Removing normals
         removeNormal(int)             Remove by index

           clearNormals()             Remove all normals



Retrieving normals
           getNormal(int)            Get normal by index
ofMesh
Adding indices
         addIndex(ofIndexType)              Add a index

     addIndices(const<ofIndextype>&)   Add a bunch of indices
       addIndices(ofIndexType*,int)    Add bunch of indices
        setIndex(int, ofIndexType)      Set a specific index




Removing indices
          removeIndex(int i)             Remove by index

            clearIndices()               Remove all indices



Retrieving indices
             getIndex(int)             Get index by index ;-)
ofMesh
Adding colors
         addColor(const ofFloatColor& c)                Add a index

      addColors(const<ofFloatColor>& cols)         Add a bunch of indices
    addColors(const ofFloatColor* cols, int amt)   Add bunch of indices
     setColor(int index, const ofFloatColor& c)     Set a specific index




Removing colors
            removeColor(int index)                   Remove by index

                 clearColors()                       Remove all indices



Retrieving colors
        ofFloatColor getColor(int i)               Get index by index ;-)
ofMesh
Useful for GL_ARRAY_BUFFER / VBO
            getNumVertices()               Total number of vertices

             getNumColors()                 Total number of colors

          getNumTexCoords()             Total number of texture coords

            getNumIndices()                Total number of indices



        float* getVerticesPointer()       Get a pointer to the vertices

        float* getColorsPointer()          Get a pointer to the colors

       float* getNormalsPointer()        Get pointer to stored normals

   ofIndexType* getTexCoordsPointer()      Get pointer to texcoords
ofMesh

Same API for the rest
• Same API for Colors, TexCoord

•   Helper function addTriangle(int,int,int)
Create two planes                   testApp.cpp
                                    void testApp::setup(){

                                    
   // bottom
                                    
   cube.addVertex(ofVec3f(-1,0,1));
                                    
   cube.addVertex(ofVec3f(1,0,1));
                                    
   cube.addVertex(ofVec3f(1,0,-1));
                                    
   cube.addVertex(ofVec3f(-1,0,-1));
                                    
                                    
   // top
                                    
   cube.addVertex(ofVec3f(-1,1,1));
                                    
   cube.addVertex(ofVec3f(1,1,1));
                                    
   cube.addVertex(ofVec3f(1,1,-1));
                                    
   cube.addVertex(ofVec3f(-1,1,-1));

                                    
                                    
   // triangles bottom
                                    
   cube.addIndex(0);
                                    
   cube.addIndex(1);
                                    
   cube.addIndex(2);
                                    
   cube.addIndex(2);
                                    
   cube.addIndex(3);
testApp.h                           
   cube.addIndex(0);
                                    
class testApp : public ofBaseApp{
                                    
   // triangles top
                                    
   cube.addIndex(4);

 public:
                                    
   cube.addIndex(5);

 
    ofMesh cube;
                                    
   cube.addIndex(6);
};
                                    
   cube.addIndex(6);
                                    
   cube.addIndex(7);
                                    
   cube.addIndex(4);
                                    
                                    }
Create a cube                       testApp.cpp

                                     void testApp::setup(){
                                     
 // bottom vertices
                                     
 cube.addVertex(ofVec3f(-1,0,1));
                                     
 cube.addVertex(ofVec3f(1,0,1));
                                     
 cube.addVertex(ofVec3f(1,0,-1));
                                     
 cube.addVertex(ofVec3f(-1,0,-1));
                                     
                                     
 // top vertices
                                     
 cube.addVertex(ofVec3f(-1,1,1));
                                     
 cube.addVertex(ofVec3f(1,1,1));
                                     
 cube.addVertex(ofVec3f(1,1,-1));
                                     
 cube.addVertex(ofVec3f(-1,1,-1));

                                     
   // indices
                                     
   cube.addTriangle(0,1,2);   // bottom
                                     
   cube.addTriangle(2,3,0);
                                     
   cube.addTriangle(4,5,6);   // top
                                     
   cube.addTriangle(6,7,4);
                                     
   cube.addTriangle(0,4,5);   // front
                                     
   cube.addTriangle(0,1,5);
testApp.h                            
   cube.addTriangle(1,2,6);   // right
                                     
   cube.addTriangle(6,5,1);
class testApp : public ofBaseApp{    
   cube.addTriangle(2,6,3);   // back
                                     
   cube.addTriangle(3,7,6);

 public:                            
   cube.addTriangle(0,3,7);   // left

 
    ofMesh cube;                  
   cube.addTriangle(7,4,0);
};                                   }
roxlu
www.roxlu.com

Contenu connexe

Tendances

Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2Knoldus Inc.
 
Virtual Mouse Using Hand Gesture Recognition
Virtual Mouse Using Hand Gesture RecognitionVirtual Mouse Using Hand Gesture Recognition
Virtual Mouse Using Hand Gesture RecognitionIRJET Journal
 
Comp4010 2021 Lecture2-Perception
Comp4010 2021 Lecture2-PerceptionComp4010 2021 Lecture2-Perception
Comp4010 2021 Lecture2-PerceptionMark Billinghurst
 
Augmented reality The future of computing
Augmented reality The future of computingAugmented reality The future of computing
Augmented reality The future of computingAbhishek Abhi
 
Building VR Applications For Google Cardboard
Building VR Applications For Google CardboardBuilding VR Applications For Google Cardboard
Building VR Applications For Google CardboardMark Billinghurst
 
COMP 4010 - Lecture4 VR Technology - Visual and Haptic Displays
COMP 4010 - Lecture4 VR Technology - Visual and Haptic DisplaysCOMP 4010 - Lecture4 VR Technology - Visual and Haptic Displays
COMP 4010 - Lecture4 VR Technology - Visual and Haptic DisplaysMark Billinghurst
 

Tendances (7)

Intro to Three.js
Intro to Three.jsIntro to Three.js
Intro to Three.js
 
Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2
 
Virtual Mouse Using Hand Gesture Recognition
Virtual Mouse Using Hand Gesture RecognitionVirtual Mouse Using Hand Gesture Recognition
Virtual Mouse Using Hand Gesture Recognition
 
Comp4010 2021 Lecture2-Perception
Comp4010 2021 Lecture2-PerceptionComp4010 2021 Lecture2-Perception
Comp4010 2021 Lecture2-Perception
 
Augmented reality The future of computing
Augmented reality The future of computingAugmented reality The future of computing
Augmented reality The future of computing
 
Building VR Applications For Google Cardboard
Building VR Applications For Google CardboardBuilding VR Applications For Google Cardboard
Building VR Applications For Google Cardboard
 
COMP 4010 - Lecture4 VR Technology - Visual and Haptic Displays
COMP 4010 - Lecture4 VR Technology - Visual and Haptic DisplaysCOMP 4010 - Lecture4 VR Technology - Visual and Haptic Displays
COMP 4010 - Lecture4 VR Technology - Visual and Haptic Displays
 

En vedette

openFrameworks 007 - video
openFrameworks 007 - videoopenFrameworks 007 - video
openFrameworks 007 - videoroxlu
 
openFrameworks 007 - utils
openFrameworks 007 - utilsopenFrameworks 007 - utils
openFrameworks 007 - utilsroxlu
 
openFrameworks 007 - GL
openFrameworks 007 - GL openFrameworks 007 - GL
openFrameworks 007 - GL roxlu
 
openFrameworks 007 - events
openFrameworks 007 - eventsopenFrameworks 007 - events
openFrameworks 007 - eventsroxlu
 
openFrameworks 007 - sound
openFrameworks 007 - soundopenFrameworks 007 - sound
openFrameworks 007 - soundroxlu
 
openFrameworks 007 - graphics
openFrameworks 007 - graphicsopenFrameworks 007 - graphics
openFrameworks 007 - graphicsroxlu
 
Shadow Mapping with Today's OpenGL Hardware
Shadow Mapping with Today's OpenGL HardwareShadow Mapping with Today's OpenGL Hardware
Shadow Mapping with Today's OpenGL HardwareMark Kilgard
 
Kalman filter - Applications in Image processing
Kalman filter - Applications in Image processingKalman filter - Applications in Image processing
Kalman filter - Applications in Image processingRavi Teja
 
Open frameworks 101_fitc
Open frameworks 101_fitcOpen frameworks 101_fitc
Open frameworks 101_fitcbenDesigning
 
Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013aleks-f
 
Computer vision techniques for interactive art
Computer vision techniques for interactive artComputer vision techniques for interactive art
Computer vision techniques for interactive artJorge Cardoso
 

En vedette (11)

openFrameworks 007 - video
openFrameworks 007 - videoopenFrameworks 007 - video
openFrameworks 007 - video
 
openFrameworks 007 - utils
openFrameworks 007 - utilsopenFrameworks 007 - utils
openFrameworks 007 - utils
 
openFrameworks 007 - GL
openFrameworks 007 - GL openFrameworks 007 - GL
openFrameworks 007 - GL
 
openFrameworks 007 - events
openFrameworks 007 - eventsopenFrameworks 007 - events
openFrameworks 007 - events
 
openFrameworks 007 - sound
openFrameworks 007 - soundopenFrameworks 007 - sound
openFrameworks 007 - sound
 
openFrameworks 007 - graphics
openFrameworks 007 - graphicsopenFrameworks 007 - graphics
openFrameworks 007 - graphics
 
Shadow Mapping with Today's OpenGL Hardware
Shadow Mapping with Today's OpenGL HardwareShadow Mapping with Today's OpenGL Hardware
Shadow Mapping with Today's OpenGL Hardware
 
Kalman filter - Applications in Image processing
Kalman filter - Applications in Image processingKalman filter - Applications in Image processing
Kalman filter - Applications in Image processing
 
Open frameworks 101_fitc
Open frameworks 101_fitcOpen frameworks 101_fitc
Open frameworks 101_fitc
 
Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013
 
Computer vision techniques for interactive art
Computer vision techniques for interactive artComputer vision techniques for interactive art
Computer vision techniques for interactive art
 

Similaire à openFrameworks 007 - 3D

Im looking for coding help I dont really need this to be explained.pdf
Im looking for coding help I dont really need this to be explained.pdfIm looking for coding help I dont really need this to be explained.pdf
Im looking for coding help I dont really need this to be explained.pdfcontact41
 
I need help with this assignment Ive gotten abit stuck with the cod.pdf
I need help with this assignment Ive gotten abit stuck with the cod.pdfI need help with this assignment Ive gotten abit stuck with the cod.pdf
I need help with this assignment Ive gotten abit stuck with the cod.pdfConint29
 
Complete the implementation of the Weighted Graph that we began in t.pdf
Complete the implementation of the Weighted Graph that we began in t.pdfComplete the implementation of the Weighted Graph that we began in t.pdf
Complete the implementation of the Weighted Graph that we began in t.pdfmarketing413921
 
Introduction to open gl in android droidcon - slides
Introduction to open gl in android   droidcon - slidesIntroduction to open gl in android   droidcon - slides
Introduction to open gl in android droidcon - slidestamillarasan
 
Advance features of C++
Advance features of C++Advance features of C++
Advance features of C++vidyamittal
 
Cppt 101102014428-phpapp01
Cppt 101102014428-phpapp01Cppt 101102014428-phpapp01
Cppt 101102014428-phpapp01Getachew Ganfur
 
CS 354 Transformation, Clipping, and Culling
CS 354 Transformation, Clipping, and CullingCS 354 Transformation, Clipping, and Culling
CS 354 Transformation, Clipping, and CullingMark Kilgard
 
Create a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdfCreate a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdfarihantmobileselepun
 
How to add an optimization for C# to RyuJIT
How to add an optimization for C# to RyuJITHow to add an optimization for C# to RyuJIT
How to add an optimization for C# to RyuJITEgor Bogatov
 
Swift - One step forward from Obj-C
Swift -  One step forward from Obj-CSwift -  One step forward from Obj-C
Swift - One step forward from Obj-CNissan Tsafrir
 
Geometry Shader-based Bump Mapping Setup
Geometry Shader-based Bump Mapping SetupGeometry Shader-based Bump Mapping Setup
Geometry Shader-based Bump Mapping SetupMark Kilgard
 
Test beautycleanness
Test beautycleannessTest beautycleanness
Test beautycleannessbergel
 
Useful Tools for Making Video Games - XNA (2008)
Useful Tools for Making Video Games - XNA (2008)Useful Tools for Making Video Games - XNA (2008)
Useful Tools for Making Video Games - XNA (2008)Korhan Bircan
 
ImplementDijkstra’s algorithm using the graph class you implemente.pdf
ImplementDijkstra’s algorithm using the graph class you implemente.pdfImplementDijkstra’s algorithm using the graph class you implemente.pdf
ImplementDijkstra’s algorithm using the graph class you implemente.pdfgopalk44
 
Bindings: the zen of montage
Bindings: the zen of montageBindings: the zen of montage
Bindings: the zen of montageKris Kowal
 
Computer Graphics in Java and Scala - Part 1b
Computer Graphics in Java and Scala - Part 1bComputer Graphics in Java and Scala - Part 1b
Computer Graphics in Java and Scala - Part 1bPhilip Schwarz
 

Similaire à openFrameworks 007 - 3D (20)

Im looking for coding help I dont really need this to be explained.pdf
Im looking for coding help I dont really need this to be explained.pdfIm looking for coding help I dont really need this to be explained.pdf
Im looking for coding help I dont really need this to be explained.pdf
 
I need help with this assignment Ive gotten abit stuck with the cod.pdf
I need help with this assignment Ive gotten abit stuck with the cod.pdfI need help with this assignment Ive gotten abit stuck with the cod.pdf
I need help with this assignment Ive gotten abit stuck with the cod.pdf
 
Complete the implementation of the Weighted Graph that we began in t.pdf
Complete the implementation of the Weighted Graph that we began in t.pdfComplete the implementation of the Weighted Graph that we began in t.pdf
Complete the implementation of the Weighted Graph that we began in t.pdf
 
Introduction to open gl in android droidcon - slides
Introduction to open gl in android   droidcon - slidesIntroduction to open gl in android   droidcon - slides
Introduction to open gl in android droidcon - slides
 
Advance features of C++
Advance features of C++Advance features of C++
Advance features of C++
 
Cppt 101102014428-phpapp01
Cppt 101102014428-phpapp01Cppt 101102014428-phpapp01
Cppt 101102014428-phpapp01
 
CS 354 Transformation, Clipping, and Culling
CS 354 Transformation, Clipping, and CullingCS 354 Transformation, Clipping, and Culling
CS 354 Transformation, Clipping, and Culling
 
OpenGL L06-Performance
OpenGL L06-PerformanceOpenGL L06-Performance
OpenGL L06-Performance
 
Create a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdfCreate a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdf
 
How to add an optimization for C# to RyuJIT
How to add an optimization for C# to RyuJITHow to add an optimization for C# to RyuJIT
How to add an optimization for C# to RyuJIT
 
Swift - One step forward from Obj-C
Swift -  One step forward from Obj-CSwift -  One step forward from Obj-C
Swift - One step forward from Obj-C
 
libGDX: Tiled Maps
libGDX: Tiled MapslibGDX: Tiled Maps
libGDX: Tiled Maps
 
Geometry Shader-based Bump Mapping Setup
Geometry Shader-based Bump Mapping SetupGeometry Shader-based Bump Mapping Setup
Geometry Shader-based Bump Mapping Setup
 
Exploiting vectorization with ISPC
Exploiting vectorization with ISPCExploiting vectorization with ISPC
Exploiting vectorization with ISPC
 
Test beautycleanness
Test beautycleannessTest beautycleanness
Test beautycleanness
 
Cpp tutorial
Cpp tutorialCpp tutorial
Cpp tutorial
 
Useful Tools for Making Video Games - XNA (2008)
Useful Tools for Making Video Games - XNA (2008)Useful Tools for Making Video Games - XNA (2008)
Useful Tools for Making Video Games - XNA (2008)
 
ImplementDijkstra’s algorithm using the graph class you implemente.pdf
ImplementDijkstra’s algorithm using the graph class you implemente.pdfImplementDijkstra’s algorithm using the graph class you implemente.pdf
ImplementDijkstra’s algorithm using the graph class you implemente.pdf
 
Bindings: the zen of montage
Bindings: the zen of montageBindings: the zen of montage
Bindings: the zen of montage
 
Computer Graphics in Java and Scala - Part 1b
Computer Graphics in Java and Scala - Part 1bComputer Graphics in Java and Scala - Part 1b
Computer Graphics in Java and Scala - Part 1b
 

Dernier

Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024The Digital Insurer
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesBoston Institute of Analytics
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 

Dernier (20)

Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 

openFrameworks 007 - 3D

  • 2. 3D ofNode ofMesh of3dUtils ofCamera ofEasyCam
  • 3. ofCamera Camera movement and matrices • Extends from ofNode • Basic GLUT camera functions • Coordinate conversions
  • 4. ofCamera Frustum setup angle of field of view in y direction, in degrees setFov(float) (45-60) setNearClip(float) near clipping plane distance setFarClip(float) set far clipping plane distance
  • 5. ofCamera Perspective and modelview matrices getProjectionMatrix() Ortho / Perspective getModelViewMatrix() Position/Orientation getModelViewProjectionMatrix() Modelview * Projection
  • 6. ofCamera Coordinate conversion worldToScreen() Convert openGL world to screen screenToWorld() Convert screen to GL world worldToCamera() Convert world to camera cameraToWorld() Convert camera to world
  • 7. ofCamera testApp.h class testApp : public ofBaseApp{ public: ... ofCamera cam; };
  • 8. ofCamera testApp.cpp void testApp::setup(){ ofBackground(33,33,33); cam.setNearClip(0.1); cam.setFarClip(100); // "1 meter" to the right, "5 meters" away from object cam.setPosition(ofVec3f(1,0,5)); } void testApp::draw(){ cam.begin(); glPointSize(10); glBegin(GL_POINTS); glVertex3f(0,0,0); glEnd(); cam.end(); }
  • 10. ofNode 3D object container • Standard 3D scene item • Manage position, scale and orientation • Lots of fantastic helper functions • ofCamera extends from this class
  • 11. ofNode Movement truck() Move left to right (x-axis) boom() Move up and down (y-axis) dolly() Move forward and backward (z-axis) setPosition() Set position directly
  • 12. ofNode Rotation tilt() Rotate around x-axis pan() Rotate around y-axis dolly() Rotate around z-axis rotate(a,axis) Rotate around arbitrary axis
  • 13. ofNode Testing movement/orientation Apply ofNode transformation (does a transformGL() glPushMatrix/glMultMatrixf()) Does a glPopMatrix, call after transformGL and restoreTransformGL() drawing. resetTransform() Resets the orientation and position
  • 14. ofNode void setScale(float s) void setScale(float x, float y, float z) void setScale(const ofVec3f& p) void setPosition(float x, float y, float z) void setPosition(const ofVec3f& p) void setGlobalPosition(float x, float y, float z) void setGlobalPosition(const ofVec3f& p) void setOrientation(const ofQuaternion& q) void setOrientation(const ofVec3f& eulerAngles) void setGlobalOrientation(const ofQuaternion& q)
  • 15. ofNode Custom 3D nodes • Create custom class and inherit from ofNode • Implement virtual customDraw(void) member function. • To draw, just call draw(void) on instance
  • 16. ofNode Extend ofNode class MyCustom3DNode : public ofNode { public: virtual void customDraw() { ofSphere(0,0,0,0.7); ofDrawAxis(2 ); } };
  • 17. ofEasyCam Camera interaction made easy begin()/end() Put your draw calls between these setTarget(ofNode) Follow and look at a target
  • 18. ofEasyCam Custom ofNode - example ofEasyCam class MyCustom3DNode : public ofNode { public: virtual void customDraw() { ofSphere(0,0,0,0.7); ofDrawAxis(2); } }; class testApp : public ofBaseApp{ public: ofEasyCam easy_cam; vector<MyCustom3DNode*> custom_nodes; MyCustom3DNode* mover; };
  • 19. ofEasyCam Custom ofNode - example ofEasyCam void testApp::setup(){ ofBackground(33,33,33); // set distance of camera "5" meters away easy_cam.setDistance(5); // create a bunch of custom 3D nodes float r = 4; for(int i = 0; i < 10; ++i) { MyCustom3DNode* node = new MyCustom3DNode(); node->setPosition( cos((float)i/10*TWO_PI) * r ,sin((float)i/10*TWO_PI) * r ,-5 ); custom_nodes.push_back(node); mover = node; } // set target for camera easy_cam.setTarget(*mover); }
  • 20. ofEasyCam Custom ofNode - example ofEasyCam void testApp::draw(){ easy_cam.begin(); // draw custom nodes. for(int i = 0; i < custom_nodes.size(); ++i) { custom_nodes[i]->draw(); } // move over x-axis. float truck_amount = sin(ofGetElapsedTimef()*0.5) * 0.001; mover->truck(truck_amount); easy_cam.end(); }
  • 21. ofMesh Container for all vertex related data • Use this when working with 3D meshes. It creates a model that is used by openGL to draw 3D shapes. • Future proof (ready for modern openGL) • Clean API for most used data: add[Vertex,Color,TexCoord]() • Nice interface for writing 3D exports (OBJ, PLY) • Use this with Vertex Buffer Objects (VBO)
  • 22. ofMesh Adding vertices addVertex(ofVec3f) Add one vertex addVertices(vector<ofVec3f>&) Reference to ofVec3f addVertices(ofVec3f*, int num) Pointer to vertices setVertex(int index) Remove by index Remove vertices removeVertex(int index) Remove by index clearVertices() Remove all vertices Get vertex getVertex(int) Get one vertex
  • 23. ofMesh Adding normals addNormal(ofVec3f&) Add a normal addNormals(vector<ofVec3f>) Add vector of normals addNormals(ofVec3f*, int) Add array of normals setNormal(int, ofVec3f&) Set one normal by index Removing normals removeNormal(int) Remove by index clearNormals() Remove all normals Retrieving normals getNormal(int) Get normal by index
  • 24. ofMesh Adding indices addIndex(ofIndexType) Add a index addIndices(const<ofIndextype>&) Add a bunch of indices addIndices(ofIndexType*,int) Add bunch of indices setIndex(int, ofIndexType) Set a specific index Removing indices removeIndex(int i) Remove by index clearIndices() Remove all indices Retrieving indices getIndex(int) Get index by index ;-)
  • 25. ofMesh Adding colors addColor(const ofFloatColor& c) Add a index addColors(const<ofFloatColor>& cols) Add a bunch of indices addColors(const ofFloatColor* cols, int amt) Add bunch of indices setColor(int index, const ofFloatColor& c) Set a specific index Removing colors removeColor(int index) Remove by index clearColors() Remove all indices Retrieving colors ofFloatColor getColor(int i) Get index by index ;-)
  • 26. ofMesh Useful for GL_ARRAY_BUFFER / VBO getNumVertices() Total number of vertices getNumColors() Total number of colors getNumTexCoords() Total number of texture coords getNumIndices() Total number of indices float* getVerticesPointer() Get a pointer to the vertices float* getColorsPointer() Get a pointer to the colors float* getNormalsPointer() Get pointer to stored normals ofIndexType* getTexCoordsPointer() Get pointer to texcoords
  • 27. ofMesh Same API for the rest • Same API for Colors, TexCoord • Helper function addTriangle(int,int,int)
  • 28. Create two planes testApp.cpp void testApp::setup(){ // bottom cube.addVertex(ofVec3f(-1,0,1)); cube.addVertex(ofVec3f(1,0,1)); cube.addVertex(ofVec3f(1,0,-1)); cube.addVertex(ofVec3f(-1,0,-1)); // top cube.addVertex(ofVec3f(-1,1,1)); cube.addVertex(ofVec3f(1,1,1)); cube.addVertex(ofVec3f(1,1,-1)); cube.addVertex(ofVec3f(-1,1,-1)); // triangles bottom cube.addIndex(0); cube.addIndex(1); cube.addIndex(2); cube.addIndex(2); cube.addIndex(3); testApp.h cube.addIndex(0); class testApp : public ofBaseApp{ // triangles top cube.addIndex(4); public: cube.addIndex(5); ofMesh cube; cube.addIndex(6); }; cube.addIndex(6); cube.addIndex(7); cube.addIndex(4); }
  • 29. Create a cube testApp.cpp void testApp::setup(){ // bottom vertices cube.addVertex(ofVec3f(-1,0,1)); cube.addVertex(ofVec3f(1,0,1)); cube.addVertex(ofVec3f(1,0,-1)); cube.addVertex(ofVec3f(-1,0,-1)); // top vertices cube.addVertex(ofVec3f(-1,1,1)); cube.addVertex(ofVec3f(1,1,1)); cube.addVertex(ofVec3f(1,1,-1)); cube.addVertex(ofVec3f(-1,1,-1)); // indices cube.addTriangle(0,1,2); // bottom cube.addTriangle(2,3,0); cube.addTriangle(4,5,6); // top cube.addTriangle(6,7,4); cube.addTriangle(0,4,5); // front cube.addTriangle(0,1,5); testApp.h cube.addTriangle(1,2,6); // right cube.addTriangle(6,5,1); class testApp : public ofBaseApp{ cube.addTriangle(2,6,3); // back cube.addTriangle(3,7,6); public: cube.addTriangle(0,3,7); // left ofMesh cube; cube.addTriangle(7,4,0); }; }

Notes de l'éditeur

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n