1、使用glsl實現圖形的旋轉。
旋轉變換,就是說給定乙個角度和點,我們將點繞著乙個座標軸旋轉。在旋轉過程中發生變化的總是x,y,z三個座標裡面的其中兩個,而不讓第三個座標值變化。這意味著,旋轉路徑總在三個座標軸平面中的乙個之中:繞 z 軸的是 xy 面、繞 x 軸的是 yz 面、繞 y 軸的是 xy 面。當然還有許多複雜的旋轉變換可以讓你繞任意乙個向量旋轉。
對於三維空間上的一點(x,y,z),繞z 軸旋轉a弧度,我們使用4*4齊次矩陣的形式來表示:
1、theta = i*pi/180.0 角度轉換為弧度;程式中旋轉了45度。
2、向量vec4(cos(theta),sin(theta),0.0,0)表示的是第1列,矩陣運算後,點(x,y)繞z軸旋轉theta弧度到(xcos(theta)-ysin(theta),xsin(theta)+ycos(theta))處。
"""
glfw_square03.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 theta;
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)
theta = i*pi/180.0
gluniform1f(glgetuniformlocation(self.program, "theta"), theta)
# 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(300, 300, "rotation square ", 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)
pi = 3.14159265358979323846264
# 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)
i=45.0
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是乙個開放的三維圖形軟體包,它獨立於視窗系統和作業系統,以它為基礎開發的應用程...
Python之OpenGL筆記 8 平移變換
1 使用glsl實現圖形的平移。平移變換的任務是將乙個物件沿著乙個任意長度和方向的向量移動。對於三維空間上的一點 x,y,z 我們使用4 4齊次矩陣的形式來表示平移變換 使用四維向量來表示三維向量的做法稱作齊次座標,這對3d圖形學來說普遍而又實用。向量的第四個分量稱之為 w 事實上,我們在以前教程中...