Python之OpenGL筆記 8 平移變換

2021-09-24 15:27:28 字數 3967 閱讀 4261

1、使用glsl實現圖形的平移。

平移變換的任務是將乙個物件沿著乙個任意長度和方向的向量移動。

對於三維空間上的一點(x,y,z),我們使用4*4齊次矩陣的形式來表示平移變換:

使用四維向量來表示三維向量的做法稱作齊次座標,這對3d圖形學來說普遍而又實用。向量的第四個分量稱之為 「w」 。事實上,我們在以前教程中見到的著色器中的內建變數 gl_position 就是乙個四維向量,w 分量會在將3d場景投影到 2d 平面時起重要作用!通用的做法是: w = 1 時表示點,w = 0 時表示向量。原因是點可以被平移但是向量不行,你可以改變向量的長度和方向,但是無論向量的起點在**,所有具有相同長度和方向的向量是被視為相同的!所以你可以簡單地用原點作為所有向量的起點!當我們將 w 設定為0時,乘以變換矩陣後的向量還會是相同的向量。

1、在glsl程式中,建立乙個4*4齊次矩陣dot,將該矩陣與每個點相乘可得到x,y座標都平移scare的新點座標。

2、向量vec4(scale,scale,0.0,1.0)表示的是第4列,矩陣運算後,點(x,y)移到(x+scale,y+scale)處

"""

glfw_square02.py

author: dalong10

description: draw a square, learning opengl

"""import glutils #common opengl utilities,see glutils.py

import sys, random, math

import opengl

from opengl.gl import *

from opengl.gl.shaders import *

import numpy

import numpy as np

import glfw

strvs = """

#version 330 core

layout(location = 0) in vec3 position;

uniform float scale;

void main()

"""strfs = """

#version 330 core

out vec3 color;

void main()

"""class firstsquare:

def __init__(self, side):

self.side = side

# load shaders

self.program = glutils.loadshaders(strvs, strfs)

gluseprogram(self.program)

s = side/2.0

vertices = [

-s, s, 0,

s, s, 0,

s, -s, 0 ,

-s, -s, 0

]# set up vertex array object (vao)

self.vao = glgenvertexarrays(1)

glbindvertexarray(self.vao)

# set up vbos

vertexdata = numpy.array(vertices, numpy.float32)

self.vertexbuffer = glgenbuffers(1)

glbindbuffer(gl_array_buffer, self.vertexbuffer)

glbufferdata(gl_array_buffer, 4*len(vertexdata), vertexdata,

gl_static_draw)

#enable arrays

self.vertindex = 0

glenablevertexattribarray(self.vertindex)

# set buffers

glbindbuffer(gl_array_buffer, self.vertexbuffer)

glvertexattribpointer(0, 3, gl_float, gl_false, 0, none)

# unbind vao

glbindvertexarray(0)

def render(self):

# use shader

gluseprogram(self.program)

scale = i*0.1

gluniform1f(glgetuniformlocation(self.program, "scale"), scale)

# bind vao

glbindvertexarray(self.vao)

# draw

gldrawarrays(gl_line_loop, 0, 4)

# unbind vao

glbindvertexarray(0)

if __name__ == '__main__':

import sys

import glfw

import opengl.gl as gl

def on_key(window, key, scancode, action, mods):

if key == glfw.key_escape and action == glfw.press:

glfw.set_window_should_close(window,1)

# initialize the library

if not glfw.init():

sys.exit()

# create a windowed mode window and its opengl context

window = glfw.create_window(640, 480, "square translation transformation", none, none)

if not window:

glfw.terminate()

sys.exit()

# make the window's context current

glfw.make_context_current(window)

# install a key handler

glfw.set_key_callback(window, on_key)

# loop until the user closes the window

while not glfw.window_should_close(window):

# render here

width, height = glfw.get_framebuffer_size(window)

ratio = width / float(height)

gl.glviewport(0, 0, width, height)

gl.glclear(gl.gl_color_buffer_bit)

gl.glclearcolor(0.0,0.0,4.0,0.0)

firstsquare0 = firstsquare(1.0)

for i in range(-4,4):

firstsquare0.render()

# swap front and back buffers

glfw.swap_buffers(window)

# poll for and process events

glfw.poll_events()

glfw.terminate()

Python之OpenGL學習筆記摘要

一 視窗工具包glfw安裝 opengl open graphics library pyopengl庫函式 glfw python視窗工具包 注 另存 二 現代opengl程式設計常用幾個通用函式 三維幾何圖形定義 vbo等 通過定義在三維空間中三角形的頂點,並指定每個頂點相關聯顏色,定義三維幾何...

OpenGL學習筆記之了解OpenGL

opengl 全寫open graphicslibrary 是個定義了乙個跨程式語言 跨平台的程式設計介面規格的專業的圖形程式介面。它用於三維影象 二維的亦可 是乙個功能強大,呼叫方便的底層圖形庫。說白了,就是opengl是乙個開放的三維圖形軟體包,它獨立於視窗系統和作業系統,以它為基礎開發的應用程...

openGL之圓環 openGL學習筆記(七)

畫圓環的想法與畫球體的想法大致相同,不同的是,圓環中間為空,而環體的直徑又相同,所以通過設定兩個半徑,用兩個半徑和角度就可以確定每個點的x,y,z座標。首先,還是先把環體切成幾個部分,每個部分開啟之後都是乙個矩形,把每個矩形都用畫三角形帶的方式繪製出來的話,那麼圓環就可以實現。接下來就是座標的計算 ...