ok.
I’ve been searching for 1 week, but I can not create a sphere with relief but i found maybe librairy for this.
I found library or create procedural sphere :
bitbucket.org/soos/panda-proced … cedural.py
i have sphere but relief not appear correctly, this is my code :
from __future__ import print_function
import os
import sys
from panda3d.core import Vec3, load_prc_file_data, ShaderTerrainMesh
from direct.showbase.ShowBase import ShowBase
from panda3d.core import *
from pandac.PandaModules import *
from panda3d.bullet import BulletRigidBodyNode
from panda3d.bullet import BulletTriangleMesh
from panda3d.bullet import BulletTriangleMeshShape
from panda3d.bullet import BulletDebugNode
from panda3d.bullet import BulletWorld
from pandac.PandaModules import *
from math import *
def empty(prefix, points = False):
path = NodePath(prefix + '_path')
node = GeomNode(prefix + '_node')
path.attachNewNode(node)
gvd = GeomVertexData('gvd', GeomVertexFormat.getV3(), Geom.UHStatic)
geom = Geom(gvd)
gvw = GeomVertexWriter(gvd, 'vertex')
node.addGeom(geom)
if points:
prim = GeomPoints(Geom.UHStatic)
else:
prim = GeomTriangles(Geom.UHStatic)
return (gvw, prim, geom, path)
def IcoSphere(radius, subdivisions):
(gvw, prim, geom, path) = empty('ico')
verts = []
phi = .5*(1.+sqrt(5.))
invnorm = 1/sqrt(phi*phi+1)
verts.append(Vec3(-1, phi, 0) * invnorm) #0
verts.append(Vec3( 1, phi, 0) * invnorm) #1
verts.append(Vec3(0, 1, -phi) * invnorm) #2
verts.append(Vec3(0, 1, phi) * invnorm) #3
verts.append(Vec3(-phi,0, -1) * invnorm) #4
verts.append(Vec3(-phi,0, 1) * invnorm) #5
verts.append(Vec3( phi,0, -1) * invnorm) #6
verts.append(Vec3( phi,0, 1) * invnorm) #7
verts.append(Vec3(0, -1, -phi) * invnorm) #8
verts.append(Vec3(0, -1, phi) * invnorm) #9
verts.append(Vec3(-1, -phi,0) * invnorm) #10
verts.append(Vec3( 1, -phi,0) * invnorm) #11
faces = [
0,1,2,
0,3,1,
0,4,5,
1,7,6,
1,6,2,
1,3,7,
0,2,4,
0,5,3,
2,6,8,
2,8,4,
3,5,9,
3,9,7,
11,6,7,
10,5,4,
10,4,8,
10,9,5,
11,8,6,
11,7,9,
10,8,11,
10,11,9
]
size = 60
# Step 2 : tessellate
for subdivision in range(0,subdivisions):
size*=4;
newFaces = []
for i in range(0,int(size/12)):
i1 = faces[i*3]
i2 = faces[i*3+1]
i3 = faces[i*3+2]
i12 = len(verts)
i23 = i12+1
i13 = i12+2
v1 = verts[i1]
v2 = verts[i2]
v3 = verts[i3]
# make 1 vertice at the center of each edge and project it onto the sphere
vt = v1+v2
vt.normalize()
verts.append(vt)
vt = v2+v3
vt.normalize()
verts.append(vt)
vt = v1+v3
vt.normalize()
verts.append(vt)
# now recreate indices
newFaces.append(i1)
newFaces.append(i12)
newFaces.append(i13)
newFaces.append(i2)
newFaces.append(i23)
newFaces.append(i12)
newFaces.append(i3)
newFaces.append(i13)
newFaces.append(i23)
newFaces.append(i12)
newFaces.append(i23)
newFaces.append(i13)
faces = newFaces
for i in range(0,len(verts)):
gvw.addData3f(VBase3(verts[i]))
for i in range(0, int(len(faces)/3)):
prim.addVertices(faces[i*3],faces[i*3+1],faces[i*3+2])
prim.closePrimitive()
geom.addPrimitive(prim)
data = []
data.append(path)
data.append(prim)
data.append(geom)
return data
class Application(ShowBase):
def __init__(self):
ShowBase.__init__(self)
base.cam.setPos(0, -50, 0)
debugNode = BulletDebugNode('Debug')
debugNP = render.attachNewNode(debugNode)
debugNP.show()
world = BulletWorld()
world.setDebugNode(debugNP.node())
world.setGravity(Vec3(0, 0, -9.81))
planete = IcoSphere(radius=1, subdivisions=3)
model = planete[0]
model.reparentTo(self.render)
heightfield = loader.loadTexture("heightfield.png")
terrain_node = ShaderTerrainMesh()
terrain_node.heightfield = heightfield
terrain_node.target_triangle_width = 6.0
terrain_node.generate()
terrain_n = model.attach_new_node(terrain_node)
mesh = BulletTriangleMesh()
mesh.addGeom(planete[2])
shape = BulletTriangleMeshShape(mesh, dynamic = False)
nodeBox = BulletRigidBodyNode('Panda')
nodeBox.addShape(shape)
nodeBox.setMass(0)
nodeControlBox = render.attachNewNode(nodeBox)
world.attachRigidBody(nodeBox)
Application().run()
can you help me ?