Qt使用QPainter繪製3D立方體

2022-09-25 06:57:12 字數 2709 閱讀 2775

1.實現思路

(網上有另一篇類似的,不過他不是用的 qt 自帶的矩陣運算類)

實現思路有點類似使用 opengl 畫立方體,先準備頂點資料:

//立方體前後四個頂點,從右上角開始順時針

vertexarr=qvector,

qvector3d,

qvector3d,

qvector3d,

qvector3d,

qvector3d,

qvector3d,

qvector3d };

//六個面,乙個面包含四個頂點

elementarr=qvector>,

, ,, ,

};然後再和旋轉矩陣、透視矩陣進行運算,得到 3d 頂點座標在 2d 平面上的 xy 值。根據頂點 xy 值,得到每個面的路徑,然後繪製表面的路徑。

這裡面比較麻煩的是判斷哪些是表面,單個立方體還好,可以遍歷比較 z 值,如果是多個物體運算量就大了,還是直接 opengl 吧,畢竟我這個只是畫著玩的。

2.實現**

** github 鏈結

實現效果 gif **:

主要**:

#ifndef mycube_h

#define mycube_h

#include

#include

#include

#include

class mycube : public qwidget;

#endif // mycube_h

#include "mycube.h"

#include

#include

#include

mycube::mycube(qwidget *parent)

: qwidget(parent)

, qvector3d,

qvector3d,

qvector3d,

qvector3d,

qvector3d,

qvector3d,

qvector3d };

//六個面,乙個面包含四個頂點

elementarr=qvector>,

, ,

, ,

};setfocuspolicy(qt::clickfocus); //widget預設沒有焦點}

void mycube::paintevent(qpaintevent *event)

else if(abs(vertex.z()-vertex_max_value) element_path_list; //每個面路徑

qlist element_z_values; //每個面中心點的z值

qlist element_z_points; //每個面中心點在平面對應xy值

qlist element_front_list; //elementarr中表面的index

for(int i=0;i點的就是正交表面可見的

bool is_front=true;

for(int vertex_index:vertex_max_list)

}if(is_front)

element_path_list.push_back(element_path);

element_z_values.push_back((vt0.z()+vt2.z())/2);

element_z_points.push_back((getpoint(vt0,cube_width)+getpoint(vt2,cube_width))/2);

} //遠小近大,還要把包含max但是被近大遮蓋的去掉

qlist element_front_remove;

for(int i=0;ielement_z_values.at(index_j)

&&element_path_list.at(index_i).contains(element_z_points.at(index程式設計客棧_j)))

}} for(int index:element_front_remove)

//根據計算好的路徑繪製

painter.setrenderhint(qpainter::antialiasing,true);

//畫表面

for(auto index:element_front_list)

//畫被遮蓋面的邊框虛線

painter.setpen(qpen(qt::white,1,qt::dashline));

for(int i=0;i程式設計客棧th_list.at(index));

} painter.restore();

painter.drawtext(20,30,"drag moving");}

void mycube::mousepressevent(qmouseevent *event)

void mycube::mousemoveevent(qmouseevent *event)

qwidget::mousemoveevent(event);}

void mycube::mousereleaseevent(qmouseevent *event)

qpointf mycube::getpoint(const qvector3d &vt,int w) const

; return qpointf;

}本文標題: qt使用qpainter繪製3d立方體

本文位址: /ruanjian/c/336548.html

Qt中QPainter的問題

我在進行2d繪製時,採用了qpainter的方法,想在qlabel上繪圖,所以直接就 qpainter painter,painter.begin label 報錯 qpainter begin paint device returned engine 0,type 1 qpainter end p...

Qt學習 QPainter之漸變填充

前面說了有關反走樣的相關知識,下面來說一下漸變。漸變是繪圖中很常見的一種功能,它是利用顏色插值使得兩個或更多顏色之間能夠平滑過渡,簡單來說就是可以把幾種顏色混合在一起,讓它們能夠自然地過渡,而不是一下子變成另一種顏色。它們常被用來建立二維圖形的三維效果。漸變的演算法比較複雜,寫得不好的話效率會很低,...

Qt圓形等待介面繪製 3

一 效果圖如下 二 效果圖拆解 根據效果圖,實際就是以控制項中心為圓心,計算周圍12個小圓座標,然後繪製12個不同顏色,不同透明度的小圓。這裡顏色有兩個漸變,前幾個小圓透明度逐漸減小,後幾個小圓透明度逐漸增加,並且同時有顏色漸變。四 準備工作 初始化視窗類,類繼承自qdialog,設定視窗大小,去掉...