網(wǎng)上有很多關(guān)于pos機相機背景,python3D編程概念的知識,也有很多人為大家解答關(guān)于pos機相機背景的問題,今天pos機之家(www.tjfsxbj.com)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
1、pos機相機背景
pos機相機背景
前面4節(jié)課程,基本都是在宇宙中觀察,這次讓我們回到地球上,看看人間的朝朝暮暮。同時,學(xué)習(xí)更多的3d編程的概念:相機、節(jié)點樹與鍵盤控制。
相機在3D編程中,相機是一個基本概念。我們從屏幕上看到的畫面,正是系統(tǒng)內(nèi)三維世界對相機的一個投影。相機與聚光燈光源的設(shè)置類似,有位置、朝向?qū)傩?,此外還有一個所謂的透鏡屬性。這個透鏡決定了相機的視角有多寬。
屏幕3D不能和人眼相比的一個關(guān)鍵因素就在這里,屏幕視角一般以40度為適當(dāng),視角太大則畫面嚴(yán)重失真。而人類的掃視視角則可以寬達(dá)150度。所以人類在自然的天空找太陽是非常容易的,但是在屏幕上三維世界中,只有40度的視角,想從天上找到太陽就得費點事了。
相機還有另外一個特點是:對于距離極近的事物,相機就看不到了,即使勉強展示也只不過是一片純色。所以我們的相機不能太貼近地面,否則就看不到地面。
節(jié)點樹熊貓引擎的所有可見事物,都稱作節(jié)點,節(jié)點采用樹狀的方式來組織管理。最基本的世界節(jié)點叫做render,我們在前面的代碼中已經(jīng)看過了,所有的模型必須最終關(guān)聯(lián)到render才可見。
在節(jié)點樹中,所有下級節(jié)點都會跟隨上級節(jié)點一起運動。而下級節(jié)點的坐標(biāo)也都是參照上級節(jié)點而言的。這就帶來了很多便利。
cm = panda3d.core.CardMaker('') cm.setFrame(-2, 2, -2, 2) floorTex = loader.loadTexture('grass.jpg') self.earth = render.attachNewNode(panda3d.core.PandaNode("floor")) for y in range(12): for x in range(12): nn = self.earth.attachNewNode(cm.generate()) nn.setP(-90) nn.setPos((x - 6) * 4, (y - 6) * 4, 0) self.earth.setTexture(floorTex) self.camera.reparentTo(self.earth)
這次,我們的地球不再使用球體,而是一個虛擬節(jié)點。然后用CardMaker建立若干(144)片草地鋪成地面。這里的CardMaker負(fù)責(zé)建立一個簡單的矩形平面,在它的表面貼上素材,模擬草地。每片草地都掛接在earth節(jié)點下,同時把相機(camera)也掛接在earth節(jié)點下。
這樣,當(dāng)?shù)厍蚬?jié)點做自轉(zhuǎn)運動時,所有的草地與我們的相機都會跟隨轉(zhuǎn)動。
地球自轉(zhuǎn):
self.angle += delta * speed angleRadians = self.angle * (pi / 180.0) self.earth.setHpr(0, self.angle, 0)太陽和光源
一如既往的,我們把太陽和光源放在同一個位置。由于這次有了地球的自轉(zhuǎn),我們只須讓太陽和光源都固定不變即可。
self.sun = loader.loadModel("sphere") sunMaterial = panda3d.core.Material() sunMaterial.setEmission((1, 1, 1, 0.2)) self.sun.setMaterial(sunMaterial) self.sun.reparentTo(render) self.sun_tex = loader.loadTexture("sun_1k_tex.jpg") self.sun.setTexture(self.sun_tex, 1) self.sun.setScale(3) self.sun.setPos(0, -10, 50) self.light.setPos(0, -10, 50)
為了避免日落后3D世界中真正的一片漆黑,這次是必須放一個背景光源了。
self.alight = render.attachNewNode(panda3d.core.AmbientLight("Ambient")) self.alight.node().setColor(panda3d.core.LVector4(0.12, 0.12, 0.12, 1)) sunlight = panda3d.core.PointLight('plight') self.light = render.attachNewNode(sunlight) render.setLight(self.light) render.setLight(self.alight)鍵盤控制
為了能夠更好地進(jìn)行觀察,我們這次加入兩組鍵盤控制:左右鍵讓視角左轉(zhuǎn)和右轉(zhuǎn),上下鍵則對應(yīng)著抬頭和低頭。左右鍵是360度連續(xù)運動,而上鍵則以抬頭至90度為止,下鍵則以視角平視為止(低頭看地板也沒什么意思)。
鍵盤控制,通過accept函數(shù)來定義:
self.keys = {} for key in ['arrow_left', 'arrow_right', 'arrow_up', 'arrow_down']: self.keys[key] = 0 self.accept(key, self.push_key, [key, 1])
其中,self.push_key是一個函數(shù):
def push_key(self, key, value): self.keys[key] = value
鍵盤只記錄,而對鍵盤效果的處理,仍然放在定時任務(wù)中。
delta = globalClock.getDt() self.camera.setPos(self.camx, self.camy, 3) self.heading += (delta * 90 * self.keys['arrow_left'] + delta * 90 * -self.keys['arrow_right']) self.pitch += (delta * 90 * self.keys['arrow_up'] + delta * 90 * -self.keys['arrow_down']) if self.pitch>90: self.pitch= 90 elif self.pitch<0: self.pitch= 0 self.camera.setHpr(self.heading, self.pitch, 0) self.camera.setPos(self.camx, self.camy, 3)
以上就是關(guān)于pos機相機背景,python3D編程概念的知識,后面我們會繼續(xù)為大家整理關(guān)于pos機相機背景的知識,希望能夠幫助到大家!
