Terragen SkySphere ???

Return to Pipeline

Terragen SkySphere ???

Postby Child_OnLine » Sat Mar 03, 2007 6:52 am

I was wondering if there's a way to create a texture for a SkySphere with Terragen and then apply this texture to a hemisphere or sphere using MilkShape or Blender.

So, could someone please help me, by showing me how to do this ???

THX
>-=@ WAR WITH R3ALITY=-<
User avatar
Child_OnLine
 
Posts: 31
Joined: Sat Jan 27, 2007 9:04 am
Location: on the .NET

Postby ThomasEgi » Sat Mar 03, 2007 8:34 am

i havent heared about skyspheres.. but it's easy to create a skybox :) . there are a number of tutorials you can find when googling. those are not directly for panda but they work too.
User avatar
ThomasEgi
 
Posts: 2149
Joined: Fri Jul 28, 2006 10:43 am
Location: Germany,Koblenz

Postby rdb » Sat Mar 03, 2007 9:05 am

rdb
 
Posts: 9443
Joined: Mon Dec 04, 2006 5:58 am
Location: Netherlands

Postby Child_OnLine » Sat Mar 03, 2007 10:56 am

I did managed to create a SkyCube using Terragen, a script for Terragen and MilkShape... but when I imported the textured cube in Panda... the texture was no longer seamless... There were bright white lines where the polygons of the cube joined...

I guess this is caused by the light in the scene... any clues???
>-=@ WAR WITH R3ALITY=-<
User avatar
Child_OnLine
 
Posts: 31
Joined: Sat Jan 27, 2007 9:04 am
Location: on the .NET

Postby enn0x » Sun Mar 04, 2007 5:21 am

Well, not exactly an answer to your question, but perhaps this is useful for you.

I prefer sky spheres or sky domes over sky boxes, since it easier to move clouds around on a sphere than on a box. The following script creates a textured sky dome (the upper part of a hemisphere, from zenith down to about 45 degrees). It can be used with a tileable sky/cloud texture.

I don't create a full hemisphere because I don't like the vertical parts at the horizon, and even with scaling in horizontal dimension you have these vertical parts. A hemisphere would be ok for starfields since the stars a very very far away, while clouds usually have a finite altitude. 45 degrees would be a cloud altitude of about 6000km if I am right.

This approach works well with tileable, moving cloud textures, but if you want to have parts of the horizon (distant mountains etc.) on you sky then it won't help you.

Usage: just load the model, re-parent it somewhere, and scale it to your camera's far distance (actually, a bit less). Oh, and move it around with your camera.

enn0x

Code: Select all
from pandac.PandaModules import EggData
from pandac.PandaModules import EggPolygon
from pandac.PandaModules import EggTexture
from pandac.PandaModules import EggVertex
from pandac.PandaModules import EggVertexPool
from pandac.PandaModules import Filename
from pandac.PandaModules import Point2D
from pandac.PandaModules import Point3D

import math
import os

nrows = 6
ncols = 16
uvscale = 2.8
texture = 'clouds.png'

sqrt2 = math.sqrt( 2.0 )

def makePoly( g, vlist ):
    _poly = EggPolygon( )

    for _v in vlist:
        _poly.addVertex( _v )

    g.addChild( _poly )

def makeVertex( x, y, z, u, v ):
    _v = EggVertex( )

    _v.setPos( Point3D( x, y, z ) )
    _v.setUv( Point2D( u, v ) )

    vp.addVertex( _v )
    return _v

# egg data
vp = EggVertexPool( 'sky' )

data = EggData( )
data.addChild( vp )
data.setCoordinateSystem( 1 ) # CS_zup_right

# vertices
zenith = makeVertex( 0.0, 0.0, sqrt2 - 1.0, 0.0, 0.0 )
vertices = { }
for j in range( 1, nrows + 1 ):
    for i in range( ncols ):
        phi = math.radians( 360.0 / ncols * i )
        theta = math.radians( 45.0 / nrows * j )

        x = sqrt2 * math.sin( theta ) * math.cos( phi )
        y = sqrt2 * math.sin( theta ) * math.sin( phi )
        z = sqrt2 * math.cos( theta ) - 1.0

        factor = uvscale
        u = x * factor
        v = y * factor

        vertices[ ( j, i ) ] = makeVertex( x, y, z, u, v )

# triangles ( first row )
for i in range( ncols ):
    v1 = zenith
    v2 = vertices[ ( 1, ( i + 1 ) % ncols ) ]
    v3 = vertices[ ( 1, i ) ]

    makePoly( data, [ v1, v2, v3 ] )

# quads ( other rows )
for j in range( 1, nrows ):
    for i in range( ncols ):
        i0 = i
        i1 = ( i + 1 ) % ncols
        j0 = j
        j1 = j + 1

        v1 = vertices[ ( j0, i0 ) ]
        v2 = vertices[ ( j0, i1 ) ]
        v3 = vertices[ ( j1, i1 ) ]
        v4 = vertices[ ( j1, i0 ) ]

        makePoly( data, [ v1, v2, v3, v4 ] )

# texture
tex = EggTexture( 'clouds', texture )
tex.setMagfilter( EggTexture.FTLinearMipmapLinear )
tex.setMinfilter( EggTexture.FTLinearMipmapLinear )

n = data.getFirstChild( )
while n:
    if type( n ) == EggPolygon:
        n.addTexture( tex )
    n = data.getNextChild( )

# save
data.writeEgg( Filename( 'sky.egg' ) )

# egg2bam
os.system( 'egg2bam sky.egg -o sky.bam' )
enn0x
 
Posts: 1375
Joined: Wed Nov 08, 2006 1:39 am
Location: Germany, Munich

Postby Child_OnLine » Sun Mar 04, 2007 7:40 am

WHOOA!!! Thanks enn0x!!! this script really helped... I now have a perfectly working sky... except now I don't have tileable sky textures... but that shouldn't be a big problem
>-=@ WAR WITH R3ALITY=-<
User avatar
Child_OnLine
 
Posts: 31
Joined: Sat Jan 27, 2007 9:04 am
Location: on the .NET


Return to Pipeline

Who is online

Users browsing this forum: No registered users and 0 guests

cron