File:3dtexture cube.png

Don't mind the mess!

We're currently in the process of migrating the Panda3D Manual to a new service. This is a temporary layout in the meantime.

Top
Python C++
3dtexture_cube.png(400 × 300 pixels, file size: 20 KB, MIME type: image/png)

This image was generated with the following program:

from direct.directbase.DirectStart import *
from pandac.PandaModules import *

GridColor = [
    VBase3D(0.9, 0, 0),
    VBase3D(0, 0, 1),
    VBase3D(0, 0.8, 0),
    VBase3D(0, 0.7, 0.7)
    ]

base.setBackgroundColor(1, 1, 1, 1)

stage = render.attachNewNode('stage')
dl = DirectionalLight('dl')
dlnp = base.camera.attachNewNode(dl)
stage.setLight(dlnp)

def make3DTexture(texSize, gridSize):
    tex = Texture('grid')
    tex.setup3dTexture()
    tex.setMagfilter(Texture.FTNearest)
    tex.setMinfilter(Texture.FTNearest)
    tex.setWrapU(Texture.WMClamp)
    tex.setWrapV(Texture.WMClamp)
    tex.setWrapW(Texture.WMClamp)
    for zi in range(gridSize):
        p = PNMImage(texSize, texSize)
        for yi in range(texSize):
            ym = gridSize * yi / texSize
            for xi in range(texSize):
                xm = gridSize * xi / texSize
                if (xm == zi):
                    # Color.
                    color = GridColor[xm]
                else:
                    # White.
                    color = VBase3D(1, 1, 1)
                    
                if ((xm + ym + zi) & 1):
                    # Dark.
                    p.setXel(xi, yi, color * 0.6)
                else:
                    # Light.
                    p.setXel(xi, yi, color)

        tex.load(p, zi)
    return tex

def drawArrow(arrows, fromPoint, toPoint):
    arrow = NodePath('arrowRoot')
    arrow.reparentTo(arrows)
    ls = LineSegs('line')
    ls.setColor(0.4, 0.5, 1, 1)

    ls.moveTo(*fromPoint)
    ls.drawTo(*toPoint)
    arrow.attachNewNode(ls.create())

    ls = LineSegs('h2')
    ls.setColor(0.4, 0.5, 1, 1)
    ls.moveTo(-0.03, 0, -0.07)
    ls.drawTo(0, 0, 0)
    ls.drawTo(0.03, 0, -0.07)
    h1 = arrow.attachNewNode('h1')
    h2 = h1.attachNewNode(ls.create())
    h2.setBillboardAxis()
    h1.setPos(*toPoint)
    h1.lookAt(*fromPoint)
    h1.setP(h1, 90)

    return arrow

def showTextureLevel(tex, zi, x, y):
    name = 'grid_%s.png' % (zi)
    root = NodePath(name)
    root.reparentTo(aspect2d)
    root.setPos(x, 0, y)

    # Extract out level zi of tex.
    p = PNMImage()
    tex.store(p, zi)

    texLevel = Texture(name)
    texLevel.load(p)

    cm = CardMaker('card')
    cm.setFrame(-0.3, 0.3, -0.3, 0.3)
    card = root.attachNewNode(cm.generate())
    card.setTexture(texLevel)

    ls = LineSegs('frame')
    ls.setColor(0, 0, 0, 1)
    ls.moveTo(-0.3, 0, -0.3)
    ls.drawTo(0.3, 0, -0.3)
    ls.drawTo(0.3, 0, 0.3)
    ls.drawTo(-0.3, 0, 0.3)
    ls.drawTo(-0.3, 0, -0.3)
    root.attachNewNode(ls.create())

    tn = TextNode('label')
    tn.setAlign(TextNode.ACenter)
    tn.setTextColor(0.4, 0.5, 1, 1)

    tn.setText(name)
    label = root.attachNewNode(tn)
    label.setPos(0, 0, -0.45)
    label.setScale(0.1)

    return root

# Make the three arrows.
arrows = render.attachNewNode('arrows')
xarrow = drawArrow(arrows, (0, -0.1, -0.1), (1, -0.1, -0.1))
yarrow = drawArrow(arrows, (1.1, 0, -0.1), (1.1, 1, -0.1))
zarrow = drawArrow(arrows, (-0.1, -0.1, 0), (-0.1, -0.1, 1))


# Make the five corner labels.
labels = aspect2d.attachNewNode('labels')
labels.setScale(0.1)
tn = TextNode('label')
tn.setTextColor(0.4, 0.5, 1, 1)

tn.setText('(0, 0, 0)')
tnp000 = labels.attachNewNode(tn.generate())
tnp000.setPos(-8, 0, -4.5)

tn.setText('(0, 0, 1)')
tnp001 = labels.attachNewNode(tn.generate())
tnp001.setPos(-9, 0, 5.5)

tn.setText('(0, 1, 1)')
tnp011 = labels.attachNewNode(tn.generate())
tnp011.setPos(-1.5, 0, 8.5)

tn.setText('(1, 1, 1)')
tnp111 = labels.attachNewNode(tn.generate())
tnp111.setPos(8, 0, 7)

tn.setText('(1, 1, 0)')
tnp110 = labels.attachNewNode(tn.generate())
tnp110.setPos(7.8, 0, -2.5)

tn.setText('(1, 0, 0)')
tnp100 = labels.attachNewNode(tn.generate())
tnp100.setPos(1.2, 0, -8)

tn.setText('(1, 0, 1)')
tnp101 = labels.attachNewNode(tn.generate())
tnp101.setPos(2, 0, 3)

tn.setSlant(0.2)
tn.setText('u')
tnpU = labels.attachNewNode(tn.generate())
tnpU.setPos(-3, 0, -7.5)

tn.setText('v')
tnpV = labels.attachNewNode(tn.generate())
tnpV.setPos(6.2, 0, -6.5)

tn.setText('w')
tnpW = labels.attachNewNode(tn.generate())
tnpW.setPos(-8.3, 0, 0)

tex = make3DTexture(128, 4)
tex.writePages(Filename('grid_#.png'))

stage.setTexGen(TextureStage.getDefault(), TexGenAttrib.MWorldPosition)
stage.setTexture(tex, 1)

box = loader.loadModel('box.egg')
box.reparentTo(stage)

base.disableMouse()
camera.setPos(2.3, -2.3, 2.3)
camera.setHpr(35, -30, 0)

base.graphicsEngine.renderFrame()
base.screenshot('3dtexture_cube.png', defaultFilename = 0)

box.hide()
smiley = loader.loadModel('smiley')
smiley.reparentTo(stage)
smiley.setScale(0.5)
smiley.setPos(0.5, 0.5, 0.5)

base.graphicsEngine.renderFrame()
base.screenshot('3dtexture_sphere.png', defaultFilename = 0)

smiley.hide()
teapot = loader.loadModel('teapot.egg')
teapot.reparentTo(stage)
teapot.setScale(0.2)
teapot.setPos(0.44, 0.5, 0.2)

base.graphicsEngine.renderFrame()
base.screenshot('3dtexture_teapot.png', defaultFilename = 0)

# Finally, show the levels of the texture.
stage.hide()
labels.hide()
arrows.hide()

l0 = showTextureLevel(tex, 0, -0.5, 0.5)
l1 = showTextureLevel(tex, 1, 0.5, 0.5)
l2 = showTextureLevel(tex, 2, -0.5, -0.4)
l3 = showTextureLevel(tex, 3, 0.5, -0.4)

base.graphicsEngine.renderFrame()
base.screenshot('3dtexture_levels.png', defaultFilename = 0)

File history

Click on a date/time to view the file as it appeared at that time.

Date/TimeThumbnailDimensionsUserComment
current11:33, 8 October 2005Thumbnail for version as of 11:33, 8 October 2005400 × 300 (20 KB)Drwr (Talk | contribs)

Top