Пример #1
0
    def resetCamera(self, viewer):
        camera = viewer.getCamera()
        camera.setComputeNearFarMode(False)
        #        camera = osg.Camera()
        camera.setViewport(osg.Viewport(0, 0, self.width(), self.height()))
        #        camera.setReferenceFrame(osg.Transform.ABSOLUTE_RF)
        CAMERA_ANGLE = 45.0
        CAMERA_Z_TRANSLATE = 2.4142135623730949  #1.0 / math.tan(math.radians(CAMERA_ANGLE / 2.0))
        cameraPosition = [0.0, 0.0, CAMERA_Z_TRANSLATE]

        camera.setProjectionMatrixAsPerspective(
            CAMERA_ANGLE,
            float(self.width()) / float(self.height()), 0.1, 100.0)

        eye = osg.Vec3d(cameraPosition[0], cameraPosition[1],
                        cameraPosition[2])
        center = osg.Vec3d(0, 0, 0)
        up = osg.Vec3d(0, 1, 0)
        camera.setViewMatrixAsLookAt(eye, center, up)

        camera.getOrCreateStateSet().setAttributeAndModes(
            osg.BlendFunc(GL.GL_ONE, GL.GL_ONE_MINUS_SRC_ALPHA))
        camera.getOrCreateStateSet().setMode(GL.GL_DEPTH_TEST, False)
        camera.getOrCreateStateSet().setMode(GL.GL_DEPTH_WRITEMASK, False)
        camera.getOrCreateStateSet().setMode(GL.GL_LIGHTING, False)
        material = osg.Material()
        color = osg.Vec4(1.0, 1.0, 1.0, 1.0)
        material.setDiffuse(osg.Material.FRONT_AND_BACK, color)
        material.setAmbient(osg.Material.FRONT_AND_BACK, color)
        camera.getOrCreateStateSet().setAttributeAndModes(material)
        camera.setClearColor(osg.Vec4(0, 0, 0, 0))
        camera.setClearMask(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)

        camera.setCullMask(VISIBLE_CULL_MASK)

        if not self.gw:
            raise Exception("GraphicsWindow not yet created")

        self.camera = camera

        #        viewer.getCamera().setViewport(osg.Viewport(0,0, self.width(), self.height()))
        #        viewer.getCamera().addChild(camera)
        camera.setGraphicsContext(self.gw)
Пример #2
0
def createAxis():
    geode = osg.Geode()
    geometry = osg.Geometry()

    vertices = osg.Vec3Array()
    vertices.push_back(osg.Vec3(0.0, 0.0, 0.0))
    vertices.push_back(osg.Vec3(1.0, 0.0, 0.0))
    vertices.push_back(osg.Vec3(0.0, 0.0, 0.0))
    vertices.push_back(osg.Vec3(0.0, 1.0, 0.0))
    vertices.push_back(osg.Vec3(0.0, 0.0, 0.0))
    vertices.push_back(osg.Vec3(0.0, 0.0, 1.0))
    geometry.setVertexArray(vertices)

    colors = osg.Vec4Array()
    colors.push_back(osg.Vec4(1.0, 0.0, 0.0, 1.0))
    colors.push_back(osg.Vec4(1.0, 0.0, 0.0, 1.0))
    colors.push_back(osg.Vec4(0.0, 1.0, 0.0, 1.0))
    colors.push_back(osg.Vec4(0.0, 1.0, 0.0, 1.0))
    colors.push_back(osg.Vec4(0.0, 0.0, 1.0, 1.0))
    colors.push_back(osg.Vec4(0.0, 0.0, 1.0, 1.0))
    geometry.setColorArray(colors)

    geometry.setColorBinding(osg.Geometry.BIND_PER_VERTEX)
    geometry.addPrimitiveSet(osg.DrawArrays(osg.PrimitiveSet.LINES, 0, 6))

    geode.addDrawable(geometry)
    return geode
Пример #3
0
    def camera_build(self):
        texture = self.texture_build()

        camera = osg.Camera()
        camera.setViewport(osg.Viewport(0, 0, self.width(), self.height()))
        camera.setReferenceFrame(osg.Transform.ABSOLUTE_RF)
        camera.setRenderOrder(osg.Camera.PRE_RENDER)
        camera.setRenderTargetImplementation(osg.Camera.FRAME_BUFFER_OBJECT)
        camera.attach(osg.Camera.COLOR_BUFFER, texture, 0, 0, False, 0, 0)

        CAMERA_ANGLE = 45.0
        CAMERA_Z_TRANSLATE = 2.4142135623730949  #1.0 / math.tan(math.radians(CAMERA_ANGLE / 2.0))
        cameraPosition = [0.0, 0.0, CAMERA_Z_TRANSLATE]

        camera.setProjectionMatrixAsPerspective(
            CAMERA_ANGLE,
            float(self.width()) / float(self.height()), 0.1, 10000.0)

        eye = osg.Vec3d(cameraPosition[0], cameraPosition[1],
                        cameraPosition[2])
        center = osg.Vec3d(0, 0, 0)
        up = osg.Vec3d(0, 1, 0)
        camera.setViewMatrixAsLookAt(eye, center, up)

        camera.getOrCreateStateSet().setAttributeAndModes(
            osg.BlendFunc(GL.GL_ONE, GL.GL_ONE_MINUS_SRC_ALPHA))
        camera.getOrCreateStateSet().setMode(GL.GL_DEPTH_TEST, False)
        camera.getOrCreateStateSet().setMode(GL.GL_DEPTH_WRITEMASK, False)
        camera.getOrCreateStateSet().setMode(GL.GL_LIGHTING, False)
        material = osg.Material()
        color = osg.Vec4(1.0, 1.0, 1.0, 1.0)
        material.setDiffuse(osg.Material.FRONT_AND_BACK, color)
        material.setAmbient(osg.Material.FRONT_AND_BACK, color)
        camera.getOrCreateStateSet().setAttributeAndModes(material)
        camera.setClearColor(osg.Vec4(0, 0, 0, 0))
        camera.setClearMask(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)

        return camera, texture
Пример #4
0
#!/usr/bin/env python
#dynamicosg.py

__author__ = ["Rene Molenaar"]
__url__ = ("http://code.google.com/p/osgswig/")
__version__ = "2.0.0"
__doc__ = """ This OpenSceneGraph in Python example shows creating a\
                 pickhandler that adds a wirebox and a callback to \
                 a selected node \
                 ____Rene Molenaar 2008 """

#import the needed modules
import osg, osgDB, osgGA, osgViewer, osgUtil

selmat = osg.Material()
selmat.setDiffuse(osg.Material.FRONT_AND_BACK, osg.Vec4(0.9, 0.1, 0.0, 1.0))
selmat.setEmission(osg.Material.FRONT_AND_BACK, osg.Vec4(0.8, 0.1, 0.0, 1.0))
selmat.setAmbient(osg.Material.FRONT_AND_BACK, osg.Vec4(0.5, 0.5, 0.5, 1))


def createWireBox(node):
    """create a bounding box for the node """

    #create an empty bounding box
    bb = osg.BoundingBox()

    #if we have a geode, expand by the drawables bounding box, else use the bounding sphere
    geode = osg.NodeToGeode(node)
    if geode:
        print "geode found"
        for i in range(geode.getNumDrawables()):
Пример #5
0
def createPreRenderSubGraph(subgraph, tex_width, tex_height, renderImplementation, \
                                                useImage, useTextureRectangle, useHDR, \
                                                samples, colorSamples):
    if not subgraph:
        return 0

    # create a group to contain the flag and the pre rendering camera.
    parent = osg.Group()

    #texture to render to and to use for rendering of flag.
    texture = 0
    if (useTextureRectangle):
        textureRect = osg.TextureRectangle()
        textureRect.setTextureSize(tex_width, tex_height)
        textureRect.setInternalFormat(osg.GL_RGBA)
        textureRect.setFilter(osg.Texture2D.MIN_FILTER, osg.Texture2D.LINEAR)
        textureRect.setFilter(osg.Texture2D.MAG_FILTER, osg.Texture2D.LINEAR)
        texture = textureRect
    else:
        texture2D = osg.Texture2D()
        texture2D.setTextureSize(tex_width, tex_height)
        texture2D.setInternalFormat(osg.GL_RGBA)
        texture2D.setFilter(osg.Texture2D.MIN_FILTER, osg.Texture2D.LINEAR)
        texture2D.setFilter(osg.Texture2D.MAG_FILTER, osg.Texture2D.LINEAR)
        texture = texture2D

    if useHDR:
        texture.setInternalFormat(osg.GL_RGBA16F_ARB)
        texture.setSourceFormat(osg.GL_RGBA)
        texture.setSourceType(osg.GL_FLOAT)

    #first create the geometry of the flag of which to view.

    if True:
        # create the to visualize.
        polyGeom = osg.Geometry()

        polyGeom.setName("PolyGeom")

        polyGeom.setDataVariance(osg.Object.DYNAMIC)
        polyGeom.setSupportsDisplayList(False)

        origin = osg.Vec3(0.0, 0.0, 0.0)
        xAxis = osg.Vec3(1.0, 0.0, 0.0)
        yAxis = osg.Vec3(0.0, 0.0, 1.0)
        zAxis = osg.Vec3(0.0, -1.0, 0.0)
        height = 100.0
        width = 200.0
        noSteps = 20

        vertices = osg.Vec3Array()
        bottom = osg.Vec3(origin[0], origin[1], origin[2])
        top = osg.Vec3(origin[0], origin[1], origin[2])
        top[2] += height
        dv = xAxis * (width / (float(noSteps - 1)))

        texcoords = osg.Vec2Array()

        # note, when we use TextureRectangle we have to scale the tex coords up to compensate.
        bottom_texcoord = osg.Vec2(0.0, 0.0)

        if useTextureRectangle:
            ltex_height = tex_height
            ltex_width = tex_width
        else:
            ltex_height = 1.0
            ltex_width = 1.0

        top_texcoord = osg.Vec2(0.0, ltex_height)
        dv_texcoord = osg.Vec2(ltex_width / float((noSteps - 1)), 0.0)

        for i in range(noSteps):
            vertices.push_back(top)
            vertices.push_back(bottom)
            top += dv
            bottom += dv

            texcoords.push_back(top_texcoord)
            texcoords.push_back(bottom_texcoord)
            top_texcoord += dv_texcoord
            bottom_texcoord += dv_texcoord

        # pass the created vertex array to the points geometry object.
        polyGeom.setVertexArray(vertices)

        polyGeom.setTexCoordArray(0, texcoords)

        colors = osg.Vec4Array()
        colors.push_back(osg.Vec4(1.0, 1.0, 1.0, 1.0))
        polyGeom.setColorArray(colors)
        polyGeom.setColorBinding(osg.Geometry.BIND_OVERALL)

        polyGeom.addPrimitiveSet(
            osg.DrawArrays(osg.PrimitiveSet.QUAD_STRIP, 0, vertices.size()))

        # new we need to add the texture to the Drawable, we do so by creating a
        # StateSet to contain the Texture StateAttribute.
        stateset = osg.StateSet()

        stateset.setTextureAttributeAndModes(0, texture, osg.StateAttribute.ON)

        polyGeom.setStateSet(stateset)

        #changes to the geometry
        polyGeom.setUpdateCallback(
            MyGeometryCallback(origin, xAxis, yAxis, zAxis, 1.0, 1.0 / width,
                               0.2).__disown__())

        geode = osg.Geode()
        geode.addDrawable(polyGeom)

        parent.addChild(geode)

    # then create the camera node to do the render to texture
    if True:
        camera = osg.Camera()

        # set up the background color and clear mask.
        camera.setClearColor(osg.Vec4(0.1, 0.1, 0.3, 1.0))
        camera.setClearMask(osg.GL_COLOR_BUFFER_BIT | osg.GL_DEPTH_BUFFER_BIT)

        bs = subgraph.getBound()
        if not bs.valid():
            return subgraph

        znear = 1.0 * bs.radius()
        zfar = 3.0 * bs.radius()

        # 2:1 aspect ratio as per flag geometry below.
        proj_top = 0.25 * znear
        proj_right = 0.5 * znear

        znear *= 0.9
        zfar *= 1.1

        # set up projection.
        camera.setProjectionMatrixAsFrustum(-proj_right, proj_right, -proj_top,
                                            proj_top, znear, zfar)

        # set view
        camera.setReferenceFrame(osg.Transform.ABSOLUTE_RF)
        camera.setViewMatrixAsLookAt(osg.Vec3d(bs.center())-osg.Vec3d(0.0,2.0,0.0)*bs.radius(), \
                                                          osg.Vec3d(bs.center()),\
                                                        osg.Vec3d(0.0,0.0,1.0))

        # set viewport
        camera.setViewport(0, 0, tex_width, tex_height)

        # set the camera to render before the main camera.
        camera.setRenderOrder(osg.Camera.PRE_RENDER)

        # tell the camera to use OpenGL frame buffer object where supported.
        camera.setRenderTargetImplementation(renderImplementation)

        if useImage:
            image = osg.Image()
            #image.allocateImage(tex_width, tex_height, 1, GL_RGBA, GL_UNSIGNED_BYTE);
            image.allocateImage(tex_width, tex_height, 1, osg.GL_RGBA,
                                osg.GL_FLOAT)

            # attach the image so its copied on each frame.
            camera.attach(osg.Camera.COLOR_BUFFER, image, samples,
                          colorSamples)

            camera.setPostDrawCallback(MyCameraPostDrawCallback(image))

            # Rather than attach the texture directly to illustrate the texture's ability to
            # detect an image update and to subload the image onto the texture.  You needn't
            # do this when using an Image for copying to, as a separate camera.attach(..)
            # would suffice as well, but we'll do it the long way round here just for demonstration
            # purposes (long way round meaning we'll need to copy image to main memory, then
            # copy it back to the graphics card to the texture in one frame).
            # The long way round allows us to manually modify the copied image via the callback
            # and then let this modified image by reloaded back.
            texture.setImage(0, image)

        else:
            # attach the texture and use it as the color buffer.
            camera.attach(osg.Camera.COLOR_BUFFER, texture, 0, 0, False,
                          samples, colorSamples)

        # add subgraph to render
        camera.addChild(subgraph)

        parent.addChild(camera)

    return parent
Пример #6
0
import ctypes
import osgDB, osgViewer, osg, osgGA, osgAnimation

floatKeys = osgAnimation.FloatKeyframeContainer()
key0 = osgAnimation.FloatKeyframe(0.0, 1.0)
floatKeys.push_back(key0)

vec3Keys = osgAnimation.Vec3KeyframeContainer()
key0 = osgAnimation.Vec3Keyframe(0.0, osg.Vec3(1, 2, 3))
vec3Keys.push_back(key0)

vec4Keys = osgAnimation.Vec4KeyframeContainer()
key0 = osgAnimation.Vec4Keyframe(0.0, osg.Vec4(1, 2, 3, 4))
vec4Keys.push_back(key0)
Пример #7
0
pyramidGeometry.addPrimitiveSet(pyramidFace2)

pyramidFace3 = osg.DrawElementsUInt(osg.PrimitiveSet.TRIANGLES, 0)
pyramidFace3.push_back(2)
pyramidFace3.push_back(3)
pyramidFace3.push_back(4)
pyramidGeometry.addPrimitiveSet(pyramidFace3)

pyramidFace4 = osg.DrawElementsUInt(osg.PrimitiveSet.TRIANGLES, 0)
pyramidFace4.push_back(3)
pyramidFace4.push_back(0)
pyramidFace4.push_back(4)
pyramidGeometry.addPrimitiveSet(pyramidFace4)

colors = osg.Vec4Array()
colors.push_back(osg.Vec4(1, 0, 0, 1))  #index 0 red
colors.push_back(osg.Vec4(0, 1, 0, 1))  #index 1 green
colors.push_back(osg.Vec4(0, 0, 1, 1))  #index 2 blue
colors.push_back(osg.Vec4(1, 1, 1, 1))  #index 3 white

colorIndexArray = osg.UIntArray()
colorIndexArray.push_back(0)
colorIndexArray.push_back(1)
colorIndexArray.push_back(2)
colorIndexArray.push_back(3)
colorIndexArray.push_back(0)

pyramidGeometry.setColorArray(colors)
pyramidGeometry.setColorIndices(colorIndexArray)
pyramidGeometry.setColorBinding(osg.Geometry.BIND_PER_VERTEX)