예제 #1
0
//如果这条直径刚好在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));
}
예제 #2
0
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;
}
예제 #3
0
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
		);
}
예제 #4
0
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();

}
예제 #5
0
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();
}