SlideShare una empresa de Scribd logo
1 de 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

Más contenido relacionado

Destacado

openFrameworks 007 - utils
openFrameworks 007 - utilsopenFrameworks 007 - utils
openFrameworks 007 - utilsroxlu
 
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
 

Destacado (9)

openFrameworks 007 - utils
openFrameworks 007 - utilsopenFrameworks 007 - utils
openFrameworks 007 - utils
 
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
 

Similar a 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
 
Cppt 101102014428-phpapp01
Cppt 101102014428-phpapp01Cppt 101102014428-phpapp01
Cppt 101102014428-phpapp01Getachew Ganfur
 
Advance features of C++
Advance features of C++Advance features of C++
Advance features of C++vidyamittal
 
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
 

Similar a 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
 
Cppt 101102014428-phpapp01
Cppt 101102014428-phpapp01Cppt 101102014428-phpapp01
Cppt 101102014428-phpapp01
 
Advance features of C++
Advance features of C++Advance features of C++
Advance features of C++
 
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
 

Último

Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditSkynet Technologies
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 

Último (20)

Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance Audit
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 

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); }; }

Notas del editor

  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