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座標。首先,還是先把環體切成幾個部分,每個部分開啟之後都是乙個矩形,把每個矩形都用畫三角形帶的方式繪製出來的話,那麼圓環就可以實現。接下來就是座標的計算 ...