最初のコピーに成功したQt Demo(続き)
26609 ワード
4.tetrahedron.hコードの修正
ここには必ず
#include
5.tetrahedron.cppコードの修正
コード部分はいいですが、もう一つ重要な点は修正する必要があります.
6...proファイルの変更
QT += opengl
OpenGLを使うには必要な場所ですが、これまではこれがずっと成功しなかったと思います.ああ~~~
ここには必ず
#include
#include <QtOpenGL/QtOpenGL>
, QGLWidget
#ifndef TETRAHEDRON_H
#define
TETRAHEDRON_H
#include
<
QtGui
/
QtGui
>
#include
<
QtOpenGL
/
QtOpenGL
>
#include
<
QColor
>
#include
<
QPoint
>
class
Tetrahedron :
public
QGLWidget
{
Q_OBJECT
public
:
Tetrahedron(QWidget
*
parent
=
0
);
protected
:
void
initializeGL();
void
resizeGL(
int
width,
int
height);
void
paintGL();
void
mousePressEvent(QMouseEvent
*
event
);
void
mouseMoveEvent(QMouseEvent
*
event
);
void
mouseDoubleClickEvent(QMouseEvent
*
event
);
private
:
void
draw();
int
faceAtPosition(
const
QPoint
&
pos);
GLfloat rotationX;
GLfloat rotationY;
GLfloat rotationZ;
QColor faceColors[
4
];
QPoint lastPos;
};
#endif
//
TETRAHEDRON_H
5.tetrahedron.cppコードの修正
#include
<
QtGui
/
QtGui
>
#include
<
QtOpenGL
/
QtOpenGL
>
#include
<
tetrahedron.h
>
Tetrahedron::Tetrahedron(QWidget
*
parent)
: QGLWidget(parent)
{
setFormat(QGLFormat(QGL::DoubleBuffer
|
QGL::DepthBuffer));
rotationX
=
-
21.0
;
rotationY
=
-
57.0
;
rotationZ
=
0.0
;
faceColors[
0
]
=
Qt::red;
faceColors[
1
]
=
Qt::green;
faceColors[
2
]
=
Qt::blue;
faceColors[
3
]
=
Qt::yellow;
}
void
Tetrahedron::initializeGL()
{
qglClearColor(Qt::black);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
}
void
Tetrahedron::resizeGL(
int
width,
int
height)
{
glViewport(
0
,
0
, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat x
=
GLfloat(width)
/
height;
glFrustum(
-
x, x,
-
1.0
,
1.0
,
4.0
,
15.0
);
glMatrixMode(GL_MODELVIEW);
}
void
Tetrahedron::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT
|
GL_DEPTH_BUFFER_BIT);
draw();
}
void
Tetrahedron::draw()
{
static
const
GLfloat P1[
3
]
=
{
0.0
,
-
1.0
,
+
2.0
};
static
const
GLfloat P2[
3
]
=
{
+
1.73205081
,
-
1.0
,
-
1.0
};
static
const
GLfloat P3[
3
]
=
{
-
1.73205081
,
-
1.0
,
-
1.0
};
static
const
GLfloat P4[
3
]
=
{
0.0
,
+
2.0
,
0.0
};
static
const
GLfloat
*
const
coords[
4
][
3
]
=
{
{ P1, P2, P3 }, { P1, P3, P4 }, { P1, P4, P2 }, { P2, P4, P3 }
};
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(
0.0
,
0.0
,
-
10.0
);
glRotatef(rotationX,
1.0
,
0.0
,
0.0
);
glRotatef(rotationY,
0.0
,
1.0
,
0.0
);
glRotatef(rotationZ,
0.0
,
0.0
,
1.0
);
for
(
int
i
=
0
; i
<
4
;
++
i) {
glLoadName(i);
glBegin(GL_TRIANGLES);
qglColor(faceColors[i]);
for
(
int
j
=
0
; j
<
3
;
++
j) {
glVertex3f(coords[i][j][
0
], coords[i][j][
1
],
coords[i][j][
2
]);
}
glEnd();
}
}
void
Tetrahedron::mousePressEvent(QMouseEvent
*
event
)
{
lastPos
=
event
->
pos();
}
void
Tetrahedron::mouseMoveEvent(QMouseEvent
*
event
)
{
GLfloat dx
=
GLfloat(
event
->
x()
-
lastPos.x())
/
width();
GLfloat dy
=
GLfloat(
event
->
y()
-
lastPos.y())
/
height();
if
(
event
->
buttons()
&
Qt::LeftButton) {
rotationX
+=
180
*
dy;
rotationY
+=
180
*
dx;
updateGL();
}
else
if
(
event
->
buttons()
&
Qt::RightButton) {
rotationX
+=
180
*
dy;
rotationZ
+=
180
*
dx;
updateGL();
}
lastPos
=
event
->
pos();
}
void
Tetrahedron::mouseDoubleClickEvent(QMouseEvent
*
event
)
{
int
face
=
faceAtPosition(
event
->
pos());
if
(face
!=
-
1
) {
QColor color
=
QColorDialog::getColor(faceColors[face],
this
);
if
(color.isValid()) {
faceColors[face]
=
color;
updateGL();
}
}
}
int
Tetrahedron::faceAtPosition(
const
QPoint
&
pos)
{
const
int
MaxSize
=
512
;
GLuint buffer[MaxSize];
GLint viewport[
4
];
glGetIntegerv(GL_VIEWPORT, viewport);
glSelectBuffer(MaxSize, buffer);
glRenderMode(GL_SELECT);
glInitNames();
glPushName(
0
);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix(GLdouble(pos.x()), GLdouble(viewport[
3
]
-
pos.y()),
5.0
,
5.0
, viewport);
GLfloat x
=
GLfloat(width())
/
height();
glFrustum(
-
x, x,
-
1.0
,
1.0
,
4.0
,
15.0
);
draw();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
if
(
!
glRenderMode(GL_RENDER))
return
-
1
;
return
buffer[
3
];
}
コード部分はいいですが、もう一つ重要な点は修正する必要があります.
6...proファイルの変更
QT += opengl
OpenGLを使うには必要な場所ですが、これまではこれがずっと成功しなかったと思います.ああ~~~