簡體   English   中英

如何使用 opengl 和 pyglet 設置剪切平面

[英]How to set clipping planes with opengl and pyglet

我正在解決我的代碼問題,如果任何基元的深度值不為零,它將不會在屏幕上呈現。 我懷疑它被剪掉了。

是否有一種簡單的 Pythonic 方法可以在 pyglet 中設置我的剪切平面?

到目前為止,這是我的代碼:

import pyglet
from pyglet.gl import *
import pywavefront
from camera import FirstPersonCamera


def drawloop(win,camera):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    #glClearColor(255,255,255,255)
    glLoadIdentity()
    camera.draw()

    pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
    ('v3f', (10.0, 15.0, 0.0, 30.0, 35.0, 150.0))
    )
    glPointSize(20.)
    return pyglet.event.EVENT_HANDLED


def main():
    win = pyglet.window.Window()
    win.set_exclusive_mouse(True)
    win.clear()
    camera = FirstPersonCamera(win)
    @win.event
    def on_draw(): 
        drawloop(win,camera)
    def on_update(delta_time):
        camera.update(delta_time)
    pyglet.clock.schedule(on_update)
    pyglet.app.run()

if __name__ == '__main__':
    main()

我正在使用這里的FirstPersonCamera片段:

https://gist.github.com/mr-linch/f6dacd2a069887a47fbc

我正在解決我的代碼問題,如果任何基元的深度值不為零,它將不會在屏幕上呈現。 我懷疑它被剪掉了。

你必須設置一個投影矩陣來解決這個問題。 設置正交投影矩陣或透視投影矩陣。

投影矩陣描述了從場景上的 3D 點到視口上的 2D 點的映射。 它從眼睛空間轉換到剪輯空間,剪輯空間中的坐標通過除以剪輯坐標的w分量轉換為歸一化設備坐標(NDC)。 NDC 在 (-1,-1,-1) 到 (1,1,1) 范圍內。
剪裁空間之外的每個幾何圖形都會被剪裁。

在正交投影中,視圖空間中的坐標線性映射到剪輯空間坐標,並且剪輯空間坐標等於歸一化設備坐標,因為w分量為 1(對於笛卡爾輸入坐標)。
left、right、bottom、top、near 和 far 的值定義了一個框。 盒子體積內的所有幾何圖形在視口上都是“可見的”。

正投影

在透視投影中,投影矩陣描述了從針孔相機看到的世界中的 3D 點到視口的 2D 點的映射。
相機視錐體(截棱錐)中的眼睛空間坐標被映射到立方體(標准化設備坐標)。

透視投影

要設置投影矩陣,必須通過glMatrixMode選擇投影矩陣堆棧。

可以通過glOrhto設置正交投影:

w, h = 640, 480 # default pyglet window size

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho( -w/2, w/2, -h/2, h/2, -1000.0, 1000.0) # [near, far] = [-1000, 1000]

glMatrixMode(GL_MODELVIEW)
....

可以通過gluPerspective設置透視投影:

w, h = 640, 480 # default pyglet window size

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective( 90.0, 640.0/480, 0.1, 1000.0) # fov = 90 degrees; [near, far] = [0.1, 1000]

glMatrixMode(GL_MODELVIEW)
....

我建議使用以下坐標,在上述兩種情況下“看到”點:

例如:

pyglet.graphics.draw(2, pyglet.gl.GL_POINTS,
    ('v3f', (-50.0, -20.0, -200.0, 40.0, 20.0, -250.0)))
glPointSize(20.0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM