[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Panda3D - по русски » Panda3D » Примеры кода » Зеркальная поверхность (без использования шейдеров)
Зеркальная поверхность
ninthДата: Среда, 10.08.2011, 09:38 | Сообщение # 1
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Код
from panda3d.core import *
import direct.directbase.DirectStart
import random

class Water():    
     def __init__(self):    
         cm = CardMaker("water")
         cm.setFrame(-1, 1, -1, 1)
         self.water = render.attachNewNode(cm.generate())
         self.water.setScale(4096)
         self.water.lookAt(0, 0, -1)
         self.water.setZ(1)
         self.water.setShaderOff(1)
         self.water.setLightOff(1)
         self.water.setAlphaScale(0.5)
         self.water.setTransparency(TransparencyAttrib.MAlpha)
         wbuffer = base.win.makeTextureBuffer("water", 512, 512)
         wbuffer.setClearColorActive(True)
         wbuffer.setClearColor(base.win.getClearColor())
         self.wcamera = base.makeCamera(wbuffer)
         self.wcamera.reparentTo(render)
         self.wcamera.node().setLens(base.camLens)
         self.wcamera.node().setCameraMask(BitMask32.bit(1))
         self.water.hide(BitMask32.bit(1))
         #fir.hide(BitMask32.bit(1))
         wtexture = wbuffer.getTexture()
         wtexture.setWrapU(Texture.WMClamp)
         wtexture.setWrapV(Texture.WMClamp)
         wtexture.setMinfilter(Texture.FTLinearMipmapLinear)
         self.wplane = Plane(Vec3(0, 0, 1), Point3(0, 0, self.water.getZ()))
         wplanenp = render.attachNewNode(PlaneNode("water", self.wplane))
         tmpnp = NodePath("StateInitializer")
         tmpnp.setClipPlane(wplanenp)
         tmpnp.setAttrib(CullFaceAttrib.makeReverse())
         self.wcamera.node().setInitialState(tmpnp.getState())
         self.water.projectTexture(TextureStage("reflection"), wtexture, self.wcamera)
         base.bufferViewer.toggleEnable()
         taskMgr.add(self.update, 'water cam update')  

     def update(self, task):
         self.wcamera.setMat(base.cam.getMat(render) * self.wplane.getReflectionMat())
         return task.cont

w = Water()
box = loader.loadModel('box')
for i in xrange(50):
      newbox = box.copyTo(render)
      newbox.setPos(random.randrange(-20, 20), random.randrange(-20, 20), random.randrange(0, 20))
for i in xrange(6):
      newbox = box.copyTo(render)
      newbox.setScale(random.randrange(10, 25))
      newbox.setPos(random.randrange(-100, 100), random.randrange(-100, 100), random.randrange(-15, -5))
      newbox.setHpr(random.randrange(360), random.randrange(360), random.randrange(360))

run()
 
Форум Panda3D - по русски » Panda3D » Примеры кода » Зеркальная поверхность (без использования шейдеров)
Страница 1 из 11
Поиск: