国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python pyglet 自制3D引擎入門(二) -- 繪制立體心形,動(dòng)畫和相機(jī)控制

這篇具有很好參考價(jià)值的文章主要介紹了Python pyglet 自制3D引擎入門(二) -- 繪制立體心形,動(dòng)畫和相機(jī)控制。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Python作為目前較廣泛的編程語(yǔ)言, 用于制作3D游戲可謂得心應(yīng)手。本文講解使用Python pyglet庫(kù)自制簡(jiǎn)易3D引擎的方法技巧。

上篇:Python pyglet 自制3D引擎入門(一) – 繪制幾何體、創(chuàng)建3D場(chǎng)景

先放效果圖:
python立體愛(ài)心,Python,3D圖形繪制,python,3d,圖形渲染,游戲引擎,OpenGL

導(dǎo)入pyglet及初始化

pyglet.window部分用于實(shí)現(xiàn)窗口操作, pyglet.gl以及pyglet.gl.glu模塊包含了OpenGL的繪圖函數(shù), 也是3D引擎中的關(guān)鍵部分。
pyglet模塊可通過(guò)pip安裝: pip install pyglet。

import pyglet
from pyglet.gl import *
from pyglet.gl.glu import *
from pyglet.window import key
import math
from random import random, randint

定義常量和數(shù)據(jù):

WIDTH=400;HEIGHT=400
angle_xy = math.pi / 2 # X-Y平面內(nèi)的相機(jī)角度, 弧度制(0-360°變?yōu)?-2π)
angle_z = 0 # 相機(jī)繞Z軸旋轉(zhuǎn)的角度
distance = 20
centerx,centery,centerz = 38,9, -11 # 中心點(diǎn)位置, 相機(jī)繞中心點(diǎn)旋轉(zhuǎn)
data = [(3.2045, 50.7902), (1.5227, 49.5507), (0.2268, 47.9115), (-0.6292, 46.0584), (-0.9964, 44.1779), (-0.8378, 42.4295), (-0.5548, 41.6411), (-0.1348, 40.9221),
        (0.4219, 40.2782), (1.9425, 39.2276), (2.9045, 38.8233), (4.0, 38.5), (2.9045, 38.1766), (1.9424, 37.7722), (0.4218, 36.7216), (-0.1349, 36.0778), (-0.5548, 35.3589), (-0.8378, 34.5706), (-0.9964, 32.8226),
        (-0.6291, 30.9425), (0.227, 29.09), (1.5229, 27.4513), (3.2048, 26.2122), (5.2203, 25.5298), (7.5231, 25.5104), (10.0749, 26.2121), (12.8454, 27.6578), (15.812, 29.848),
        (18.9593, 32.7712), (22.2779, 36.4131), (24.0, 38.5), (22.2778, 40.5874), (18.9591, 44.2302), (15.8118, 47.1541), (12.8451, 49.3448), (10.0746, 50.7907),
        (7.5228, 51.4924), (5.22, 51.4729)]# 心形的矢量圖數(shù)據(jù)
z1=8; z2=10 # 心形兩個(gè)面的z坐標(biāo)

初始化pygletWindow對(duì)象, 用于繪制圖形、接收事件。

# sample_buffers為抗鋸齒,depth_size為啟用z排序
conf = pyglet.gl.Config(sample_buffers=1, samples=4, depth_size=1)
window = pyglet.window.Window(height=HEIGHT, width=WIDTH,
                              config=conf)

相機(jī)控制

類似于一些3D游戲,我們這里的相機(jī)需要實(shí)現(xiàn)360°無(wú)死角的旋轉(zhuǎn)。

convert_pos()用于轉(zhuǎn)換相機(jī)的坐標(biāo)。其中:
相機(jī)繞著一個(gè)中心點(diǎn), 2個(gè)方向旋轉(zhuǎn)。
想象相機(jī)和中心點(diǎn)距離不變, 中心點(diǎn)是球心, 相機(jī)就相當(dāng)于在一個(gè)球體表面自由移動(dòng)。程序中angle_xy類似于球體的“經(jīng)度”, angle_z類似“緯度”。通過(guò)“經(jīng)度”和“緯度”, 就能控制相機(jī)移動(dòng)。
另外, 一些3D游戲除了使用以上的“經(jīng)度”和“緯度”, 還使用了第三根軸控制相機(jī)的旋轉(zhuǎn)。
像下面這樣:
python立體愛(ài)心,Python,3D圖形繪制,python,3d,圖形渲染,游戲引擎,OpenGL

def convert_pos():
    # 將相機(jī)角度轉(zhuǎn)換為相機(jī)的X,Y,Z坐標(biāo)
    if math.pi/2 < angle_z < math.pi * 1.5:
        flag = -1 # 相機(jī)朝下
    else:
        flag = 1 # 相機(jī)朝上
    cam_x=math.cos(angle_xy)*distance *math.cos(angle_z) + centerx
    cam_y=math.sin(angle_xy)*distance *math.cos(angle_z) + centery
    cam_z=math.sin(angle_z)*distance + centerz
    return cam_x,cam_y,cam_z,flag

這是綁定pyglet窗口的事件。
按↑,↓,←,→鍵或拖動(dòng)鼠標(biāo)切換查看角度,按Page Up / Page Down鍵或滾動(dòng)鼠標(biāo),調(diào)整遠(yuǎn)近。

@window.event
def on_key_press(k,_):
    global angle_xy,angle_z,distance
    if k==key.DOWN: # 下
        angle_z -= math.pi * 1/18 # 10°
    elif k==key.UP:# 上
        angle_z += math.pi * 1/18
    elif k==key.LEFT: # 左
        angle_xy -= math.pi * 1/18
    elif k==key.RIGHT: # 右
        angle_xy += math.pi * 1/18
    elif k==key.PAGEUP: # page up
        distance/=1.15
    elif k==key.PAGEDOWN: # page down
        distance*=1.15
    angle_z %= math.pi*2
    on_draw()

@window.event
def on_mouse_drag(x,y,dx,dy,btn,_): # 拖動(dòng)鼠標(biāo), dx和dy為鼠標(biāo)位置變化的多少
    global angle_xy, angle_z
    angle_xy -= dx / 100
    angle_z -= dy / 100
    angle_z %= math.pi * 2
    on_draw()

@window.event
def on_mouse_scroll(x,y, _, d): # 滾動(dòng)鼠標(biāo), d為滾動(dòng)的多少
    global distance
    distance /= 1.1**d
    on_draw()

3D圖形繪制

這是window對(duì)象的on_draw事件,調(diào)用openGL繪圖的代碼都應(yīng)該放在這個(gè)函數(shù)里面。
如果代碼看不懂,可以看上篇中關(guān)于openGL 3D繪圖的介紹。

@window.event  # 表示綁定 window 對(duì)象的事件
def on_draw(): # 注意函數(shù)名, 必須是on_draw才能綁定繪制的事件

    glMatrixMode(GL_PROJECTION)  # 設(shè)置當(dāng)前矩陣為投影矩陣
    glLoadIdentity()

    # 透視投影, 前4個(gè)參數(shù)類似游戲中的FOV(視角大小), 
    # 后2個(gè)參數(shù)分別是物體與相機(jī)的最近、最遠(yuǎn)距離
    glFrustum(-5, 5, -5, 5, 2, 1000)  # 透視投影

    glMatrixMode(GL_MODELVIEW)  # 模型視圖矩陣
    glLoadIdentity()

    glViewport(0, 0, WIDTH, HEIGHT)

    window.clear() # 或 glClear(GL_COLOR_BUFFER_BIT)
    glClear(GL_DEPTH_BUFFER_BIT) # 清除深度(z排序)緩沖區(qū)
 
    # 改變相機(jī)位置和角度
    cam_x,cam_y,cam_z,flag = convert_pos()
    gluLookAt(cam_x,cam_y,cam_z,centerx,centery,centerz,0,0,flag) # 0,0,flag為相機(jī)朝上方向

    for dx,dy,dz in lst_pos: # 繪制列表中的各個(gè)心形
        draw_heart(dx,dy,dz)

    glFlush() # 刷新繪圖緩沖區(qū)

下面的draw_heart()函數(shù)用于在不同位置繪制3D心形, 根據(jù)二維的心形矢量圖數(shù)據(jù), 繪制正面和側(cè)面, 形成三維的形狀。glVertex3f函數(shù)定義心形每個(gè)頂點(diǎn)的坐標(biāo)。

def draw_heart(dx,dy,dz): # 繪制心形
    # dx, dy, dz為心形從中心點(diǎn)向X, Y, Z軸正方向平移多少
    # 繪制頂、底面
    glBegin(GL_POLYGON)
    glColor3f(random()*0.5+0.5, 0, random()*0.5+0.5) # 隨機(jī)生成顏色
    for x, y in data:
        glVertex3f(y+dx, z1+dy, -x+dz) # 使用y,z和-x, 旋轉(zhuǎn)心形, 使心形更易于查看
    glEnd()
    glBegin(GL_POLYGON)
    for x, y in data:
        glVertex3f(y+dx, z2+dy, -x+dz)
    glEnd()
    # 繪制透明側(cè)面
    glColor4f(0.5, 0, 0.5, 0.5)
    for i in range(len(data)):
        if i + 1 == len(data):  # 到達(dá)列表末尾
            next_point = data[0]
        else:
            next_point = data[i + 1]
        point = data[i]
        glBegin(GL_POLYGON)
        glVertex3f(point[1]+dx, z1+dy, -point[0]+dz)
        glVertex3f(next_point[1]+dx, z1+dy, -next_point[0]+dz)
        glVertex3f(next_point[1]+dx, z2+dy, -next_point[0]+dz)
        glVertex3f(point[1]+dx, z2+dy, -point[0]+dz)
        glEnd()

用計(jì)時(shí)器實(shí)現(xiàn)動(dòng)畫效果

pyglet庫(kù)自帶了計(jì)時(shí)器功能。首先,導(dǎo)入pyglet.clock模塊 (有點(diǎn)像pygame)。

from pyglet import clock

通過(guò)clock模塊中的schedule_interval函數(shù),可以設(shè)定計(jì)時(shí)器間隔。這里程序每隔0.02秒,調(diào)用一次animate函數(shù)。在animate函數(shù)中再加入實(shí)現(xiàn)動(dòng)畫的代碼。

def animate(event):
    global centerx
    centerx+=1
    xpos=lst_pos[0][0]
    lst_pos[0]=(xpos+1,0,0)
    on_draw() # 重新繪制

# 每隔0.02秒,調(diào)用一次animate函數(shù)
clock.schedule_interval(animate, 0.02)

主程序?qū)崿F(xiàn)

主程序隨機(jī)生成多個(gè)心形, 類似游戲中使用的過(guò)程生成技術(shù)。

# 隨機(jī)生成多個(gè)心形
lst_pos = [(0,0,0)] # 中心的心形
for i in range(20):
    lst_pos.append((randint(-200,200),randint(-200,200),randint(-200,200)))
glClearColor(0.8, 1, 1, 1)
glEnable(GL_DEPTH_TEST) # 開(kāi)啟深度(z排序), 使程序支持近的物體遮擋遠(yuǎn)的物體
glEnable(GL_BLEND) # 開(kāi)啟透明支持
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
pyglet.app.run()

學(xué)習(xí)了這么多, 應(yīng)該可以編寫自己的簡(jiǎn)易3D游戲了吧! 歡迎點(diǎn)贊、收藏。

源代碼見(jiàn)作者的gitcode:gitcode.net/qfcy_/python/-/tree/master/opengl。
其中還有作者的其他3D程序,下面是星空程序(space.py)的截圖:
python立體愛(ài)心,Python,3D圖形繪制,python,3d,圖形渲染,游戲引擎,OpenGL文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-692686.html

到了這里,關(guān)于Python pyglet 自制3D引擎入門(二) -- 繪制立體心形,動(dòng)畫和相機(jī)控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [Python從零到壹] 七十二.圖像識(shí)別及經(jīng)典案例篇之OpenGL入門及繪制基本圖形和3D圖

    十月太忙,還是寫一篇吧!祝大家1024節(jié)日快樂(lè)O(∩_∩)O 歡迎大家來(lái)到“Python從零到壹”,在這里我將分享約200篇Python系列文章,帶大家一起去學(xué)習(xí)和玩耍,看看Python這個(gè)有趣的世界。所有文章都將結(jié)合案例、代碼和作者的經(jīng)驗(yàn)講解,真心想把自己近十年的編程經(jīng)驗(yàn)分享給大家

    2024年02月06日
    瀏覽(18)
  • 3D科研繪圖與學(xué)術(shù)圖表繪制:從入門到精通

    3D科研繪圖與學(xué)術(shù)圖表繪制:從入門到精通

    ?? 個(gè)人網(wǎng)站:【工具大全】【游戲大全】【神級(jí)源碼資源網(wǎng)】 ?? 前端學(xué)習(xí)課程:??【28個(gè)案例趣學(xué)前端】【400個(gè)JS面試題】 ?? 尋找學(xué)習(xí)交流、摸魚劃水的小伙伴,請(qǐng)點(diǎn)擊【摸魚學(xué)習(xí)交流群】 3D科研繪圖和學(xué)術(shù)圖表繪制是科研和學(xué)術(shù)領(lǐng)域中不可或缺的一部分,可以幫助研究

    2024年02月08日
    瀏覽(18)
  • 3D引擎新勢(shì)力,帶你1分鐘快速入門AMRT3D

    3D引擎新勢(shì)力,帶你1分鐘快速入門AMRT3D

    “ AMRT3D是由眸瑞科技出品的一款專業(yè)的輕量化圖形引擎,一個(gè)互動(dòng)性的3D場(chǎng)景搭建與全場(chǎng)景渲染工具,能夠快速、輕松使用它來(lái)制作3D項(xiàng)目和應(yīng)用,具有驚人的視覺(jué)效果,并具有無(wú)感知輕量化優(yōu)勢(shì),場(chǎng)景加載快速且兼容性強(qiáng),可以減少創(chuàng)建3D項(xiàng)目所需的成本和時(shí)間。 使用AMRT

    2024年02月22日
    瀏覽(25)
  • PCL三維點(diǎn)云中的立體框映射到二維圖像(在圖像中繪制立體框)

    PCL三維點(diǎn)云中的立體框映射到二維圖像(在圖像中繪制立體框)

    三維點(diǎn)云與圖像的映射,或者說(shuō)是將三維點(diǎn)云中的點(diǎn)與二維圖像中的某一個(gè)像素點(diǎn)進(jìn)行對(duì)應(yīng)。那么這么做的目的是什么呢?用途是什么呢“ 目的 :目的就是將三維點(diǎn)與二維圖像之間的映射關(guān)系 作用 : 1、可以給點(diǎn)云賦予彩色信息,增強(qiáng)點(diǎn)云所表達(dá)物體或?qū)ο蟮谋孀R(shí)度;2、可

    2024年02月13日
    瀏覽(19)
  • ECharts: 繪制立體柱狀圖【圓柱體】

    ECharts: 繪制立體柱狀圖【圓柱體】

    其中里面的柱體漸變色是通過(guò) ECharts中內(nèi)置的漸變色生成器 echarts.graphic.LinearGradient 可以用來(lái)設(shè)置漸變色. Documentation - Apache ECharts

    2024年02月13日
    瀏覽(20)
  • 自制游戲引擎

    自制游戲引擎

    這是一個(gè)玩具 SmallEngine是引擎的核心模塊,封裝渲染功能和場(chǎng)景管理功能等 Editor是編輯器,類似unity和ue編輯器,能夠動(dòng)態(tài)添加對(duì)象和組件 Sandbox是游戲播放器,能夠運(yùn)行游戲 參考 https://www.bilibili.com/video/BV1KE41117BD/?spm_id_from=333.788.recommend_more_video.0vd_source=be4b42409fb0d5ad1e1bd5a5715b7da0 引

    2024年02月13日
    瀏覽(24)
  • Python繪制3D曲面圖

    Python繪制3D曲面圖

    前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家?!军c(diǎn)擊進(jìn)入巨牛的人工智能學(xué)習(xí)網(wǎng)站】。 在數(shù)據(jù)可視化的世界中,3D曲面圖是一種強(qiáng)大的工具,能夠?qū)?fù)雜的數(shù)據(jù)模式以清晰直觀的方式展現(xiàn)出來(lái)。Python提供了多種庫(kù)和工具,使得創(chuàng)

    2024年04月28日
    瀏覽(25)
  • python繪制3D條形圖

    python繪制3D條形圖

    python條形圖系列: 帶有誤差棒的條形圖?? 分組條形圖?? 3D條形圖 盡管在matplotlib支持在一個(gè)坐標(biāo)系中繪制多組條形圖,效果如下 其中,藍(lán)色表示中國(guó),橘色表示美國(guó),綠色表示歐盟。從這個(gè)圖就可以非常直觀地看出,三者自2018到2022年的GDP變化情況。但相比之下,通過(guò)增加

    2024年02月15日
    瀏覽(20)
  • 自制游戲引擎之shader預(yù)編譯

    自制游戲引擎之shader預(yù)編譯

    shader預(yù)編譯為二進(jìn)制,在程序運(yùn)行時(shí)候加載,可以提升性能,節(jié)省啟動(dòng)時(shí)間. third_party文件里需要放依賴的第三方 因?yàn)殡娔X訪問(wèn)google的問(wèn)題,無(wú)法通過(guò) shaderc-2023.4utilsgit-sync-deps 腳本自動(dòng)下載第三方,手動(dòng)下載 https://codeload.github.com/KhronosGroup/SPIRV-Tools/zip/refs/tags/v2023.3.rc1 https://codeloa

    2024年02月13日
    瀏覽(20)
  • WebGL入門之基于WebGL的3D可視化引擎介紹

    WebGL入門之基于WebGL的3D可視化引擎介紹

    WebGL(Web Graphics Library)是一個(gè)JavaScript API,用于在任何兼容的Web瀏覽器中渲染高性能交互式3D和2D圖形,而無(wú)需使用插件。WebGL通過(guò)引入一個(gè)非常符合OpenGL ES 2.0的API來(lái)實(shí)現(xiàn)這一點(diǎn),該API可以在HTML 元素中使用。這種一致性使 API 可以利用用戶設(shè)備提供的硬件圖形加速。WebGL完全集

    2024年02月11日
    瀏覽(93)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包