//如果这条直径刚好在BoundingBox中呢? void OBoundingBox::Merge(const OSphere& sphere) { const OVector3& center = sphere.m_center; float radius = sphere.m_radius; Merge(center + OVector3(radius, radius, radius)); Merge(center + OVector3(-radius, -radius, -radius)); }
void OBoundingBox::Init(const OSphere& sphere) { const OVector3& center = sphere.m_center; float radius = sphere.m_radius; m_min = center + OVector3(-radius, -radius, -radius); m_max = center + OVector3(radius, radius, radius); m_isInit = true; }
inline OVector3 ClipEdgeZ(const OVector3& v0, const OVector3& v1, float clipZ) { return OVector3( v1.x + (v0.x - v1.x) * ((clipZ - v1.z) / (v0.z - v1.z)), v1.y + (v0.y - v1.y) * ((clipZ - v1.z) / (v0.z - v1.z)), clipZ ); }
void OVariousObjects::DrawPlaneEq(OVector3 n, float d) { n = n * (n.FastInvertNorm()); OVector3 qn = OVector3(0, 0, 1) * n; if (qn.FastNorm() > 0.0001) { qn = qn * (1.0f / qn.Norm()); } float ang = acosf(n.Dot(OVector3(0, 0, 1))); OQuaternion q = OQuaternion(qn * sinf(ang * 0.5f), cosf(ang * 0.5f)); // Vector3 px = (q * Quaternion(1, 0, 0, 1) * q.Transpose()).V3(); // Vector3 py = (q * Quaternion(0, 1, 0, 1) * q.Transpose()).V3(); glPushMatrix(); glMultMatrixf(q.ToMatrix().GetSafeM()); glTranslatef(0, 0, d); DrawHorizontalQuad(100, 100); //DrawAxes(100, 1); glPopMatrix(); }
void DemoApplication::init() { /* set camera movement keys */ _camCtrl.setMoveEventKey(OKeyboardPressEvent::OKey_a, OCameraController::MoveLeft); _camCtrl.setMoveEventKey(OKeyboardPressEvent::OKey_s, OCameraController::MoveBack); _camCtrl.setMoveEventKey(OKeyboardPressEvent::OKey_d, OCameraController::MoveRight); _camCtrl.setMoveEventKey(OKeyboardPressEvent::OKey_w, OCameraController::MoveForward); _camCtrl.setMoveEventKey(OKeyboardPressEvent::OKey_q, OCameraController::MoveUp); _camCtrl.setMoveEventKey(OKeyboardPressEvent::OKey_e, OCameraController::MoveDown); /* subscribe to keyboard event */ addEventRecipient(OEvent::KeyboardPressEvent, this); /* text */ _fontCourier = new OFont("cour.ttf"); _title = new OText2D(_fontCourier, 12, -1.0f, -0.95f, OVector4(0.0f, 1.0f, 0.0f, 1.0f)); _title->setContent("Osiris Framework"); _fpsText = new OText2D(_fontCourier, 12, 0.55f, -0.95f, OVector4(0.0f, 1.0f, 0.0f, 1.0f)); _perfText = new OText2D(_fontCourier, 12, 0.55f, -0.90f, OVector4(0.0f, 1.0f, 0.0f, 1.0f)); _idleText = new OText2D(_fontCourier, 12, 0.55f, -0.85f, OVector4(0.0f, 1.0f, 0.0f, 1.0f)); _renderText = new OText2D(_fontCourier, 12, 0.55f, -0.80f, OVector4(0.0f, 1.0f, 0.0f, 1.0f)); _cameraText = new OText2D(_fontCourier, 12, -1.0f, 0.90f, OVector4(0.0f, 1.0f, 0.0f, 1.0f)); /* setting up the cube */ OVertexColorMesh *cube = new OVertexColorMesh(); cube->addVertexData(-0.5f, -0.5f, -0.5f); cube->addVertexData(-0.5f, -0.5f, 0.5f); cube->addVertexData(-0.5f, 0.5f, -0.5f); cube->addVertexData(-0.5f, 0.5f, 0.5f); cube->addVertexData(0.5f, -0.5f, -0.5f); cube->addVertexData(0.5f, -0.5f, 0.5f); cube->addVertexData(0.5f, 0.5f, -0.5f); cube->addVertexData(0.5f, 0.5f, 0.5f); cube->addVertexColorData(1.0f, 0.0f, 0.0f, 1.0f); cube->addVertexColorData(0.0f, 1.0f, 0.0f, 1.0f); cube->addVertexColorData(0.0f, 0.0f, 1.0f, 1.0f); cube->addVertexColorData(1.0f, 0.0f, 0.0f, 1.0f); cube->addVertexColorData(0.0f, 1.0f, 0.0f, 1.0f); cube->addVertexColorData(0.0f, 0.0f, 1.0f, 1.0f); cube->addVertexColorData(1.0f, 0.0f, 0.0f, 1.0f); cube->addVertexColorData(0.0f, 1.0f, 0.0f, 1.0f); cube->addIndexData(0, 4, 1); cube->addIndexData(1, 2, 0); cube->addIndexData(1, 4, 5); cube->addIndexData(1, 7, 3); cube->addIndexData(2, 4, 0); cube->addIndexData(2, 7, 6); cube->addIndexData(3, 2, 1); cube->addIndexData(3, 7, 2); cube->addIndexData(4, 7, 5); cube->addIndexData(5, 7, 1); cube->addIndexData(6, 4, 2); cube->addIndexData(6, 7, 4); cube->setFaceCulling(true, OMesh::CullFace_Front, OMesh::CullFront_CW); cube->init(); _cube = cube; /* setting up Torus */ OVertexColorMesh* torus = new OVertexColorMesh(); OWavefrontObjectFile torusFile("Meshes/TestTorus.mesh.obj"); int objectCount=0; const char **objectList = torusFile.objectList(&objectCount); if (objectCount > 0) torusFile.loadMesh(objectList[0], torus); for (int i = 0; i < torus->vertexCount(); i++) { OVector3 v = torus->vertexData(i); torus->addVertexColorData(fabs(v.x()), fabs(v.y()), fabs(v.z()), 1); } torus->init(); _torus = torus; /* camera */ camera()->setCameraLimits(1.0f, 10.0f); camera()->setPosition(OVector3(0.0f, 0.0f, 3.0f)); camera()->setOrientation(OVector3(0.0f, 0.0f, 0.0f)); _movRadiusA = 1.0f; _movRadiusB = 1.0f; _thetaA = 0; _thetaB = PI; _periodA = 6.0f; _periodB = 6.0f; _pauseFlag = false; _last_timeIndex = OTimeIndex::current(); }