圓柱的頂面和底面都是乙個圓形,其頂點座標為(r*cos(弧度),y,r*sin(弧度))其中r分別為圓柱高的峰值,比如正放於中心時y就是h/2或者-h/2,h/2表示頂面,-h/2表示底面。其紋理座標為(0.5-0.5*cos(弧度),0.5-0.5*sin(弧度)),法向量為垂直向上或向下的單位向量。
圓柱的側面可以將其分割為n份,用gl_********_fan繪製三角形的方式將其繪出;我們可以以弧度為分割標準,將其分成n份,其中分成的小三角形為兩個相鄰弧度求出的上、下頂點的四個座標;紋理座標可理解為弧度佔整個圓周的比例,以此來從0-1中取值得到紋理座標;法向量則為其頂點座標。
了解了圓柱的頂點生成原理後,我們就可以寫出渲染器了,其實現如下
#ifndef cylinderrender_h
#define cylinderrender_h
#include #include #include #include #define pi 3.14159265f
class cylinderrender
,*toptexture_,*bottomtexture_;
};#endif // cylinderrender_h
#include "cylinderrender.h"
void cylinderrender::initsize(qimage &ce, qimage &top, qimage &bottom, float r, float h)
vertvec_ << cevec << topvec << bottomvec;
textvec_ << cetextvec << toptexvec << bottomtexvec;
normalvec_ << cenorvec << topnorvec << bottomnorvec;
qvectorbytesvec;
bytesvec << vertvec_ << textvec_ << normalvec_;
vbo_.create();
vbo_.bind();
vbo_.allocate(bytesvec.data(),bytesvec.count() * sizeof glfloat);
}void cylinderrender::render(qopenglextrafunctions *f, qmatrix4x4 &pmatrix, qmatrix4x4 &vmatrix, qmatrix4x4 &mmatrix, qvector3d &light, qvector3d &camera)
其shader和平時的差不多,只不過用了上、下、側三個紋理
#version 330
uniform mat4 upmatrix,uvmatrix,ummatrix;
uniform vec3 ucamera,ulightlocation;
layout (location = 0)in vec3 aposition;
layout (location = 1)in vec2 atexture;
layout (location = 2)in vec3 anormal;
smooth out vec3 vposition;
smooth out vec2 vtexture;
smooth out vec4 vambient,vdiffuse,vspecular;
void pointlight(in vec3 normal,inout vec4 ambient,inout vec4 diffuse,inout vec4 specular,in vec4 lightambient,in vec4 lightdiffuse,in vec4 lightspecular,in float shininess)
void main(void)
#version 330
uniform sampler2d stextures;
in vec3 vposition;
in vec4 vambient,vdiffuse,vspecular;
in vec2 vtexture;
out vec4 fragcolor;
void main(void)
其使用和前面一樣了,傳入引數即可
#ifndef widget_h
#define widget_h
#include #include #include "cylinderrender.h"
class widget : public qopenglwidget
;#endif // widget_h
#include #include "widget.h"
widget::widget(qwidget *parent)
: qopenglwidget(parent)
widget::~widget()
void widget::paintgl()
void widget::resizegl(int w, int h)
void widget::initializegl()
void widget::mousemoveevent(qmouseevent *event)
void widget::mousepressevent(qmouseevent *event)
void widget::mousereleaseevent(qmouseevent *event)
void widget::slottimeout()
到此結束。 3D點雲形狀分類簡介
3d形狀分類主要有三種方法 基於多檢視的 multi view 基於體積的 volumetric based 基於點的 point based 基於多檢視的方法將非結構化的點雲投影為2d影象,而基於體積的方法將點雲轉換為3d體積表示。然後利用2d或3d卷積網路來實現形狀分類。相反,基於點的方法直接在...
D3D基本框架 即D3D標頭檔案分類
了dxut的結構 後,發現微軟程式設計師的編碼風格太深奧了。各種巨集定義 預編譯跳得頭暈,由於對於window api的不精通,導致寫出符合dxut風格的框架以現在的水平來看是不可能的。既然沒有弄通dxut,我也暫時不想套用了,那麼還是先自己用自己的框架來寫把。框架如下 雖然沒學會dxut,但是微軟...
D語言版趣味程式 3 繪製圓
d語言版趣味程式 3.繪製圓 說明 原文見 是c語言版。本人改寫成d tango版。與各位d初學者共勉。問題 在螢幕上用 畫乙個空心的圓 問題分析與演算法設計 列印圓可利用圖形的左右對稱性。根據圓的方程 r r x x y y 可以算出圓上每一點行和列的對應關係。import tango.io.co...