qt opengl 3d基本形狀 圓柱

2021-08-30 04:44:55 字數 2911 閱讀 4796

圓柱的頂面和底面都是乙個圓形,其頂點座標為(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...