coordinates::coordinates( float size, float thickness ): m_node( new QGLSceneNode() ) { QGLBuilder builder; builder << QGLCylinder( thickness, thickness, size, 12 ); QGLSceneNode* cylinder = builder.finalizedSceneNode(); cylinder->setPosition( QVector3D( 0, 0, 0.5 * size ) ); cylinder->setEffect( QGL::LitMaterial ); QGLBuilder arrowBuilder; arrowBuilder << QGLCylinder( 0.01, 2 * thickness, size / 3, 12 ); QGLSceneNode* arrow = arrowBuilder.finalizedSceneNode(); arrow->setPosition( QVector3D( 0, 0, size ) ); arrow->setEffect( QGL::LitMaterial ); QGLSceneNode* x = new QGLSceneNode( m_node ); x->addNode(cylinder); QMatrix4x4 matrix; QQuaternion q = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 90.0f); matrix.rotate( q ); x->setLocalTransform( matrix ); QGLSceneNode* xArrow = new QGLSceneNode( m_node ); xArrow->addNode( arrow ); xArrow->setLocalTransform( matrix ); QGLMaterial* xMaterial = new QGLMaterial; xMaterial->setDiffuseColor( QColor( 255, 0, 0, 128 ) ); x->setMaterial( xMaterial ); xArrow->setMaterial( xMaterial ); QGLSceneNode* y = new QGLSceneNode( m_node ); y->addNode(cylinder); q = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, -90.0f); matrix.rotate( q ); y->setLocalTransform( matrix ); QGLSceneNode* yArrow = new QGLSceneNode( m_node ); yArrow->addNode( arrow ); yArrow->setLocalTransform( matrix ); QGLMaterial* yMaterial = new QGLMaterial; yMaterial->setDiffuseColor(Qt::green); y->setMaterial( yMaterial ); QGLMaterial* yArrowMaterial = new QGLMaterial; yArrowMaterial->setDiffuseColor( QColor( 0, 255, 0, 128 ) ); yArrow->setMaterial( yArrowMaterial ); QGLSceneNode* z = new QGLSceneNode( m_node ); z->addNode(cylinder); QGLSceneNode* zArrow = new QGLSceneNode( m_node ); zArrow->addNode( arrow ); QGLMaterial* zMaterial = new QGLMaterial; zMaterial->setDiffuseColor(Qt::blue); z->setMaterial( zMaterial ); QGLMaterial* zArrowMaterial = new QGLMaterial; zArrowMaterial->setDiffuseColor( QColor( 0, 0, 255, 128 ) ); zArrow->setMaterial( zArrowMaterial ); }
cylinder3d::cylinder3d(float x_, float y_, float z_, float length, float top_radius_, float base_radius_, float a1_, float a2_, int r, int g, int b, int a, bool tops_) : x(x_), y(y_), z(z_), a1(a1_), a2(a2_), top_radius(top_radius_), base_radius(base_radius_), tops(tops_), node(NULL), col(r, g, b, a) { QGLBuilder builder; builder << QGLCylinder(top_radius * 2, base_radius * 2, length, 10, 3, tops, tops); node = builder.finalizedSceneNode(); //EDEBUG("win3d added: " << describe()); }
CylinderView::CylinderView(QWindow *parent) : QGLView(parent) { QGLBuilder builder; // Evil hack: it is not possible to just call glClearColor on any device // but it is possible to have a huge, dark SkyBox. Without this hack the // cylinder floats over a transparent background, displaying the contents // of the last app builder << QGL::Smooth << QGLCube(1000.0f); // Add the cylinder builder << QGL::Smooth << QGLCylinder(2.0, 1.5, 2.0, 36, 3, true, true); QGLMaterial *matLid = new QGLMaterial; matLid->setAmbientColor(Qt::gray); matLid->setDiffuseColor(Qt::gray); QUrl urlLid; urlLid.setPath(QLatin1String(":/latte.png")); urlLid.setScheme(QLatin1String("file")); matLid->setTextureUrl(urlLid); QGLMaterial *matSides = new QGLMaterial; matSides->setColor(QColor(170, 202, 0)); QUrl urlSides; urlSides.setPath(QLatin1String(":/cupTexture.png")); urlSides.setScheme(QLatin1String("file")); matSides->setTextureUrl(urlSides); QGLSceneNode *root = builder.sceneNode(); QGLSceneNode *lid = root->findChild<QGLSceneNode *>("Cylinder Top"); int lidMat = root->palette()->addMaterial(matLid); lid->setMaterialIndex(lidMat); lid->setEffect(QGL::LitDecalTexture2D); QGLSceneNode *sides = root->findChild<QGLSceneNode *>("Cylinder Sides"); int sideMat = root->palette()->addMaterial(matSides); sides->setMaterialIndex(sideMat); sides->setEffect(QGL::LitDecalTexture2D); cylinder = builder.finalizedSceneNode(); QGLMaterial *mat = new QGLMaterial; mat->setAmbientColor(Qt::gray); mat->setDiffuseColor(Qt::gray); cylinder->setMaterial(mat); cylinder->setEffect(QGL::LitMaterial); }
QGLSceneNode *Tank::tankObject() { #ifndef QT_NO_DEBUG // NOT THREADSAFE, NOT RE-ENTRANT Q_ASSERT(QThread::currentThread() == qApp->thread()); #endif static QGLSceneNode *theTank = 0; if (!theTank) { QGLBuilder build; build << QGLCylinder(1.0f, 1.0f, 1.0f, 32); theTank = build.finalizedSceneNode(); theTank->setObjectName("Tank Component"); QGraphicsRotation3D *rot = new QGraphicsRotation3D(theTank); rot->setAxis(QVector3D(1, 0, 0)); rot->setAngle(-90.0f); theTank->addTransform(rot); theTank->setY(-theTank->boundingBox().minimum().y()); } return theTank; }
/*! \internal */ void CapsuleMesh::createGeometry(bool bForce) { // Create a new geometry node for this level of detail if necessary. QGLSceneNode *geometry = 0; QMap<int, QGLSceneNode *>::iterator It = d->lodGeometry.find(d->lod); if (It != d->lodGeometry.end()) geometry = *It; if (geometry && bForce) { if (d->currentCapsule) d->topNode->removeNode(d->currentCapsule); d->currentCapsule = 0; d->lodGeometry.erase(It); geometry->setParent(0); delete geometry; geometry = 0; } if (!geometry) { QGLBuilder builder; // For the cylinder int facets = 4 * (1 << d->lod); int layers = (1 << d->lod) - 1; // For the spheres int divisions = d->lod; // Sanity check - the height of the capsule must not be less than its // diameter. A minimal capsule is a sphere - where diameter == height. if (d->length < 2.0f * d->radius) { qWarning() << "Length of capsule must exceed its diameter" << " - correcting length."; d->length = 2.0f * d->radius; } float diameter = d->radius+d->radius; float cylinderHeight = d->length - diameter; float offset = cylinderHeight/2.0f; builder << QGL::Faceted; QGLSceneNode *s = 0; s = builder.newNode(); s->setObjectName(QLatin1String("Cylinder")); builder << QGLCylinder(diameter, diameter, cylinderHeight, facets, layers, false, false); s = builder.newNode(); s->setObjectName(QLatin1String("LeftEndCap")); builder << QGLDome(diameter, divisions, false); QMatrix4x4 translateMatrix; translateMatrix.setToIdentity(); translateMatrix.rotate(180.0f, 0.0f, 1.0f, 0.0f); translateMatrix.translate(0.0f, 0.0f, offset); builder.currentNode()->setLocalTransform(translateMatrix); s = builder.newNode(); s->setObjectName(QLatin1String("RightEndCap")); builder << QGLDome(diameter, divisions, false); translateMatrix.setToIdentity(); translateMatrix.translate(0.0f, 0.0f, offset); builder.currentNode()->setLocalTransform(translateMatrix); geometry = builder.finalizedSceneNode(); geometry->setParent(this); d->lodGeometry.insert(d->lod, geometry); } Q_ASSERT_X(geometry != 0, Q_FUNC_INFO, "Could not create/find geometry!"); if (d->currentCapsule != geometry) { if (d->currentCapsule) d->topNode->removeNode(d->currentCapsule); d->topNode->addNode(geometry); d->currentCapsule = geometry; } if (!d->sceneSet) { setScene(new CapsuleScene(d->topNode)); d->sceneSet = true; } }