#!/usr/bin/env python import sys import OpenGL import math from PyOSG import osg from PyOSG import osgDB from PyOSG import osgUtil from terrain_coords import vertex from terrain_texcoords import texcoord def getDatabaseCenterRadius(): n=0.0 center = [ 0.0, 0.0, 0.0 ] dbcenter = [0,0,0] cnt = 39 * 38 for i in range(cnt): center[0] += vertex[i][0]; center[1] += vertex[i][1]; center[2] += vertex[i][2]; n = n + 1.0; center[0] /= n; center[1] /= n; center[2] /= n; r = 0.0; # for( i = 0; i < sizeof( vertex ) / (sizeof( float[3] )); i++ ) for i in range(cnt): d = math.sqrt( ((vertex[i][0] - center[0]) * (vertex[i][0] - center[0])) + ((vertex[i][1] - center[1]) * (vertex[i][1] - center[1])) + ((vertex[i][2] - center[2]) * (vertex[i][2] - center[2])) ); if d > r : r = d dbradius = r; dbcenter[0] = center[0]; dbcenter[1] = center[1]; dbcenter[2] = center[2]; index = 19 * 39 + 19; dbcenter[0] = vertex[index][0] - 0.15; dbcenter[1] = vertex[index][1]; dbcenter[2] = vertex[index][2] + 0.35; return dbradius, dbcenter def makeTerrain(): dbcenter = [0,0,0] dbradius = 0 dbradius, dbcenter = getDatabaseCenterRadius() m = len(vertex) / 39 n = 39; v = osg.Vec3Array(m*n) t = osg.Vec2Array(m*n) col = osg.Vec4Array(1) col[0][0] = col[0][1] = col[0][2] = col[0][3] = 1.0 #print len(vertex) #print len(texcoord) #print m*n for i in range(m * n): #print i v[i][0] = vertex[i][0] - dbcenter[0]; v[i][1] = vertex[i][1] - dbcenter[1]; v[i][2] = vertex[i][2]; t[i][0] = texcoord[i][0] + 0.025; t[i][1] = texcoord[i][1]; geom = osg.Geometry(); geom.setVertexArray( v ); geom.setTexCoordArray( 0, t ); geom.setColorArray( col ); geom.setColorBinding( osg.Geometry.BIND_OVERALL ); for i in range(m-2): elements = osg.DrawElementsUShort(osg.PrimitiveSet.TRIANGLE_STRIP); elements.reserve(39*2) for j in range(n): elements.push_back((i+0)*n+j); elements.push_back((i+1)*n+j); geom.addPrimitiveSet(elements); tex = osg.Texture2D(); tex.setImage(osgDB.readImageFile("Images/lz.rgb")); dstate = osg.StateSet(); dstate.setMode( OpenGL.GL.GL_LIGHTING, osg.StateAttribute.OFF ); dstate.setTextureAttributeAndModes(0, tex, osg.StateAttribute.ON ); dstate.setTextureAttribute(0, osg.TexEnv() ); geom.setStateSet( dstate ); geode = osg.Geode(); geode.addDrawable( geom ); return geode if __name__ == "__main__": terrain = makeTerrain() from PyOSG import * viewer = osgProducer.Viewer() viewer.setUpViewer(osgProducer.Viewer.STANDARD_SETTINGS) viewer.setSceneData(terrain) viewer.realize() while not viewer.done(): viewer.sync() viewer.update() viewer.frame() viewer.sync() sys.exit(0)