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,設定視窗大小,去掉...