正方体立体图怎么画?

正方体立体图怎么画?,第1张

正方体立体图,视野能看到棱边用实线画,看不到的棱边用虚线画。

用六个完全相同的正方形围成的立体图形叫正方体。侧面和底面均为正方形的直平行六面体叫正方体,即棱长都相等的六面体,又称“立方体”“正六面体”。

正方体是由6个正方形面组成的正多面体,故又称正六面体。它有12条边和8个顶点。其中正方体是特殊的长方体。它有12条棱(边)和8个顶(点),是五个柏拉图立体之一。

扩展资料:

正方体属于棱柱的一种,棱柱的体积公式同样适用,即体积=底面积×高。由于正六面体6个面全部相等,且均为正方形,所以,正六面体的体积=棱长×棱长×棱长。

正六面体具有如下特征:

(1)正六面体有8个顶点,每个顶点连接三条棱。

(2)正六面体有12条棱,每条棱长度相等。

(3)正六面体有6个面,每个面面积相等,形状完全相同。

参考资料来源:百度百科-正六面体

(1)glBegin()画点和线再用glclear()清除。
(2)glBegin(GL_TRIAGLE)画三棱锥,再glpushmatrix(),再
gltraslate()/glrotate()变换绘图矩阵,再用glBegin(GL_QUAD)画正方体,再glpushmatrix()。
这几步做成一个函数,用一个定时器去调用好了,也就是定时刷新屏幕。
(3)模型视图就是按模型自身坐标在标准坐标轴系统中绘图,学过"机械制图"就很容易懂。与之相对的是透视视图,就是按人眼3D视锥的感觉建立的坐标系统。
如果你高兴,自己也可以建个3个轴的3D坐标系统在里面画物体(相信会很难看)
不论哪种3D视图,或者说不论哪种3D坐标系统,最后都要映射到2D的屏幕上,就像画家把3D世界的物体画在纸上,只是画家凭视觉来模仿,而在电脑上,opengl之类的软件是通过复杂的矩阵计算来实现这种转换的。
补充回答:(1)glclear会清除全部。opengl不提供对图元"删除" *** 作。要达到"删除"效果,只有按图元的存在状态多次重绘图象缓冲区。
在(1)中,先画出点、线,glclear后再次只画线,点就"删"了再glclear,就全“删”了。

void MyGLWidget::loadGLTexture()
{
QImage image(":/dogjpg");
image = imageconvertToFormat(QImage::Format_RGB888);
image = imagemirrored();
glGenTextures(1, &mTexture[0]);

glBindTexture(GL_TEXTURE_2D,mTexture[0]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
imagewidth(), imageheight(), 0,
GL_RGB, GL_UNSIGNED_BYTE,
imagebits());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}

void MyGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
glTranslatef(00f,00f,-50f); // 移入屏幕 5 个单位
//下面三行使立方体绕X、Y、Z轴旋转。旋转多少依赖于变量 xrot , yrot 和 zrot 的值。
glRotatef(mXRotate,10f,00f,00f); // X轴旋转
glRotatef(mYRotate,00f,10f,00f); // Y轴旋转
glRotatef(mZRotate,00f,00f,10f); // Z轴旋转

//下一行代码选择我们使用的纹理
//如果您在您的场景中使用多个纹理,您应该使用来 glBindTexture(GL_TEXTURE_2D, texture[ 所使用纹理对应的数字 ]) 选择要绑定的
//纹理。当您想改变纹理时,应该绑定新的纹理。有一点值得指出的是,您不能在 glBegin() 和 glEnd() 之间绑定纹理,必须在 glBegin()
//之前或 glEnd() 之后绑定。注意我们在后面是如何使用 glBindTexture 来指定和绑定纹理的。
glBindTexture(GL_TEXTURE_2D, mTexture[0]); // 选择纹理
//为了将纹理正确的映射到四边形上,您必须将纹理的右上角映射到四边形的右上角,纹理的左上角映射到四边形的左上角,
//纹理的右下角映射到四边形的右下角,纹理的左下角映射到四边形的左下角。
//如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都不是。
//glTexCoord2f 的第一个参数是X坐标。 00f 是纹理的左侧。 05f 是纹理的中点, 10f 是纹理的右侧。
//glTexCoord2f 的第二个参数是Y坐标。 00f 是纹理的底部。 05f 是纹理的中点, 10f 是纹理的顶部。
//所以纹理的左上坐标是 X:00f,Y:10f ,四边形的左上顶点是 X: -10f,Y:10f 。其余三点依此类推。
//试着玩玩 glTexCoord2f X, Y坐标参数。把 10f 改为 05f 将只显示纹理的左半部分,把 00f 改为 05f 将只显示纹理的右半部分。
glBegin(GL_QUADS);
// 前面
glTexCoord2f(00f, 00f); glVertex3f(-10f, -10f, 10f); // 纹理和四边形的左下
glTexCoord2f(10f, 00f); glVertex3f( 10f, -10f, 10f); // 纹理和四边形的右下
glTexCoord2f(10f, 10f); glVertex3f( 10f, 10f, 10f); // 纹理和四边形的右上
glTexCoord2f(00f, 10f); glVertex3f(-10f, 10f, 10f); // 纹理和四边形的左上
// 后面
glTexCoord2f(10f, 00f); glVertex3f(-10f, -10f, -10f); // 纹理和四边形的右下
glTexCoord2f(10f, 10f); glVertex3f(-10f, 10f, -10f); // 纹理和四边形的右上
glTexCoord2f(00f, 10f); glVertex3f( 10f, 10f, -10f); // 纹理和四边形的左上
glTexCoord2f(00f, 00f); glVertex3f( 10f, -10f, -10f); // 纹理和四边形的左下
// 顶面
glTexCoord2f(00f, 10f); glVertex3f(-10f, 10f, -10f); // 纹理和四边形的左上
glTexCoord2f(00f, 00f); glVertex3f(-10f, 10f, 10f); // 纹理和四边形的左下
glTexCoord2f(10f, 00f); glVertex3f( 10f, 10f, 10f); // 纹理和四边形的右下
glTexCoord2f(10f, 10f); glVertex3f( 10f, 10f, -10f); // 纹理和四边形的右上
// 底面
glTexCoord2f(10f, 10f); glVertex3f(-10f, -10f, -10f); // 纹理和四边形的右上
glTexCoord2f(00f, 10f); glVertex3f( 10f, -10f, -10f); // 纹理和四边形的左上
glTexCoord2f(00f, 00f); glVertex3f( 10f, -10f, 10f); // 纹理和四边形的左下
glTexCoord2f(10f, 00f); glVertex3f(-10f, -10f, 10f); // 纹理和四边形的右下

// 右面
glTexCoord2f(10f, 00f); glVertex3f( 10f, -10f, -10f); // 纹理和四边形的右下
glTexCoord2f(10f, 10f); glVertex3f( 10f, 10f, -10f); // 纹理和四边形的右上
glTexCoord2f(00f, 10f); glVertex3f( 10f, 10f, 10f); // 纹理和四边形的左上
glTexCoord2f(00f, 00f); glVertex3f( 10f, -10f, 10f); // 纹理和四边形的左下

// 左面
glTexCoord2f(00f, 00f); glVertex3f(-10f, -10f, -10f); // 纹理和四边形的左下
glTexCoord2f(10f, 00f); glVertex3f(-10f, -10f, 10f); // 纹理和四边形的右下
glTexCoord2f(10f, 10f); glVertex3f(-10f, 10f, 10f); // 纹理和四边形的右上
glTexCoord2f(00f, 10f); glVertex3f(-10f, 10f, -10f); // 纹理和四边形的左上
glEnd();

}

void MyGLWidget::timerEvent(QTimerEvent event)
{
//现在增加 xrot , yrot 和 zrot 的值。尝试变化每次各变量的改变值来调节立方体的旋转速度,或改变+/-号来调节立方体的旋转方向。
mXRotate += 03f; // X 轴旋转
mYRotate += 02f; // Y 轴旋转
mZRotate += 04f; // Z 轴旋转

updateGL();

QGLWidget::timerEvent(event);
}

void MyGLWidget::keyPressEvent(QKeyEvent event)
{
switch (event->key()) {
case Qt::Key_F2:
{
mFullScreen = !mFullScreen;
if(mFullScreen) {
showFullScreen();
}
else {
showNormal();
}
updateGL();
break;
}
case Qt::Key_Escape:
{
qApp->exit();
break;
}
}
}
#include "myglwidgeth"
#include <QApplication>

int main(int argc, char argv[])
{
QApplication a(argc, argv);
MyGLWidget w;
wshow();

return aexec();
————————————————
版权声


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13333895.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-16
下一篇 2023-07-16

发表评论

登录后才能评论

评论列表(0条)

保存