void CannonBall::updateGeometry()
{
	// Update Boxes
	if(total_boxes > 0) {
		for( unsigned int i = 0; i < total_boxes; ++i ) {
			optix::Transform transform = boxes_group->getChild<optix::Transform>(i);
			physx::PxRigidActor* box_actor = boxes_actors.at(i);

			physx::PxU32 nShapes = box_actor->getNbShapes(); 
			physx::PxShape** shapes=new physx::PxShape*[nShapes];
	
			box_actor->getShapes(shapes, nShapes);     
			while (nShapes--) 
			{ 
				physx::PxShape* shape = shapes[nShapes];
				physx::PxTransform pT = physx::PxShapeExt::getGlobalPose(*shape, *box_actor);
				physx::PxMat33 m = physx::PxMat33(pT.q );
				float mat[16];
				convertMat(m,pT.p, mat);
				transform->setMatrix(false, mat, NULL);
			} 
			delete [] shapes;
		}

		boxes_group->getAcceleration()->markDirty();
	}

	if(total_spheres > 0) {
		for( unsigned int i = 0; i < total_spheres; ++i ) {
			optix::Transform transform = spheres_group->getChild<optix::Transform>(i);
			physx::PxRigidActor* sphere_actor = spheres_actors.at(i);

			physx::PxU32 nShapes = sphere_actor->getNbShapes(); 
			physx::PxShape** shapes=new physx::PxShape*[nShapes];
	
			sphere_actor->getShapes(shapes, nShapes);     
			while (nShapes--) 
			{ 
				physx::PxShape* shape = shapes[nShapes];
				physx::PxTransform pT = physx::PxShapeExt::getGlobalPose(*shape, *sphere_actor);
				physx::PxMat33 m = physx::PxMat33(pT.q );
				float mat[16];
				convertMat(m,pT.p, mat);
				transform->setMatrix(false, mat, NULL);
			} 
			delete [] shapes;
		}

		spheres_group->getAcceleration()->markDirty();
	}
}
Esempio n. 2
0
File: icp.cpp Progetto: hayborl/ctok
void ICP::run(bool withCuda, InputArray initObjSet)
{
	assert(!m_objSet.empty() && !m_modSet.empty());

	double d_pre = 100000, d_now = 100000;
	int iterCnt = 0;
	Mat objSet;
	Transformation tr;

	if (initObjSet.empty())
	{
		objSet = m_objSet.clone();
	}
	else
	{
		objSet = initObjSet.getMat();
	}

/*	plotTwoPoint3DSet(objSet, m_modSet);*/

	do 
	{
		d_pre = d_now;

		Mat closestSet;
		Mat lambda(objSet.rows, 1, CV_64FC1);
		RUNANDTIME(global_timer, closestSet = 
			getClosestPointsSet(objSet, lambda, KDTREE).clone(), 
			OUTPUT && SUBOUTPUT, "compute closest points.");
		Mat tmpObjSet = convertMat(m_objSet);
		Mat tmpModSet = convertMat(closestSet);
		RUNANDTIME(global_timer, tr = 
			computeTransformation(tmpObjSet, tmpModSet, lambda), 
			OUTPUT && SUBOUTPUT, "compute transformation");
		Mat transformMat = tr.toMatrix();
		RUNANDTIME(global_timer, transformPointCloud(
			m_objSet, objSet, transformMat, withCuda), 
			OUTPUT && SUBOUTPUT, "transform points.");
		RUNANDTIME(global_timer, 
			d_now = computeError(objSet, closestSet, lambda, withCuda),
			OUTPUT && SUBOUTPUT, "compute error.");

		iterCnt++;
	} while (fabs(d_pre - d_now) > m_epsilon && iterCnt <= m_iterMax);

	m_tr = tr;
/*	waitKey();*/

/*	plotTwoPoint3DSet(objSet, m_modSet);*/
}
Esempio n. 3
0
static boost::python::list get_abc_angle_axis()
{
	const RenderedBuffer & renderedBuffer = BridgeParameter::instance().first_noaccessory_buffer();
	D3DXMATRIX convertMat(
		1, 0, 0, 0,
		0, 1, 0, 0,
		0, 0, -1, 0,
		0, 0, 0, 1);

	D3DXMATRIX convertedWordInv;
	::D3DXMatrixMultiply(&convertedWordInv, &renderedBuffer.world_inv, &convertMat);
			
	D3DXVECTOR3 eye;
	{
		D3DXVECTOR3 v;
		UMGetCameraEye(&v);
		d3d_vector3_transform(eye, v, convertedWordInv);
	}

	D3DXVECTOR3 at;
	{
		D3DXVECTOR3 v;
		UMGetCameraAt(&v);
		d3d_vector3_transform(at, v, convertedWordInv);
	}

	D3DXVECTOR3 up;
	{
		D3DXVECTOR3 v;
		UMGetCameraUp(&v);
		d3d_vector3_dir_transform(up, v, convertedWordInv);
		::D3DXVec3Normalize(&up, &up);
	}

	Imath::V3d trans((double)eye.x, (double)eye.y, (double)(eye.z));

	D3DXMATRIX view;
	::D3DXMatrixLookAtLH(&view, &eye, &at, &up);

	Imath::M44d rot(
		-view.m[0][0], view.m[0][1], view.m[0][2], 0,
		-view.m[1][0], view.m[1][1], view.m[1][2], 0,
		view.m[2][0], -view.m[2][1], -view.m[2][2], 0,
		0, 0, 0, 1);

	Imath::Quatd quat = Imath::extractQuat(rot);
	quat.normalize();

	boost::python::list result;
	result.append(quat.angle());
	result.append(quat.axis()[0]);
	result.append(quat.axis()[1]);
	result.append(quat.axis()[2]);
	return result;
}
Esempio n. 4
0
// Initializing the start of the algorithm and updating the time and statusbar.
void WorkerThread::process()
{
    // starting the clock
    beginTime = clock();
    updateProgress(10);
    // creating the dynamic member for the algorithm
    context = new Algorithm(image, fgSeeds, bgSeeds, sigma, beta, Xb, Xf);
    updateProgress(20);
    resultImage = context->getSegmentation();
    updateProgress(90);
    //Collecting the segmented image
    QImage qimage;
    qimage = convertMat(resultImage);
    endTime = clock();
    // Calculating the process timing
    float processTime = (float(endTime) - float(beginTime)) / CLOCKS_PER_SEC;
    QString message = QString("Processed in %1 seconds.").arg(processTime);
    updateProgress(100);
    // let to thread know that job is done and send segmented image
    emit finished(qimage, message);
}
Esempio n. 5
0
static void export_alembic_camera(AlembicArchive &archive, const RenderedBuffer & renderedBuffer, bool isUseEuler)
{
	static const int cameraKey = 0xFFFFFF;
	Alembic::AbcGeom::OObject topObj(*archive.archive, Alembic::AbcGeom::kTop);

	Alembic::AbcGeom::OXform xform;
	if (archive.xform_map.find(cameraKey) != archive.xform_map.end())
	{
		xform = archive.xform_map[cameraKey];
	}
	else
	{
		xform = Alembic::AbcGeom::OXform(topObj, "camera_xform", archive.timesampling);
		archive.xform_map[cameraKey] = xform;

		Alembic::AbcGeom::OXformSchema &xformSchema = xform.getSchema();
		archive.xform_schema_map[cameraKey] = xformSchema;
	}
		
	// set camera transform
	{
		Alembic::AbcGeom::OXformSchema &xformSchema = archive.xform_schema_map[cameraKey];
		xformSchema.setTimeSampling(archive.timesampling);
		
		Alembic::AbcGeom::XformSample xformSample;

		D3DXMATRIX convertMat(
			1, 0, 0, 0,
			0, 1, 0, 0,
			0, 0, -1, 0,
			0, 0, 0, 1);

		D3DXMATRIX convertedWordInv;
		::D3DXMatrixMultiply(&convertedWordInv, &renderedBuffer.world_inv, &convertMat);
			
		D3DXVECTOR3 eye;
		{
			D3DXVECTOR3 v;
			UMGetCameraEye(&v);
			d3d_vector3_transform(eye, v,convertedWordInv);
		}
			
		D3DXVECTOR3 at;
		{
			D3DXVECTOR3 v;
			UMGetCameraAt(&v);
			d3d_vector3_transform(at, v, convertedWordInv);
		}

		D3DXVECTOR3 up;
		{
			D3DXVECTOR3 v;
			UMGetCameraUp(&v);
			d3d_vector3_dir_transform(up, v, convertedWordInv);
			::D3DXVec3Normalize(&up, &up);
		}

		Imath::V3d trans((double)eye.x, (double)eye.y, (double)(eye.z));
		xformSample.setTranslation(trans);

		D3DXMATRIX view;
		::D3DXMatrixLookAtLH(&view, &eye, &at, &up);

		Imath::M44d rot(
			-view.m[0][0], view.m[0][1], view.m[0][2], 0,
			-view.m[1][0], view.m[1][1], view.m[1][2], 0,
			view.m[2][0], -view.m[2][1], -view.m[2][2], 0,
			0, 0, 0, 1);

		Imath::Quatd quat = Imath::extractQuat(rot);
		quat.normalize();

		if (isUseEuler)
		{
			Imath::V3d imeuler;
			quatToEuler(imeuler, quat);

			//UMMat44d umrot(
			//	-view.m[0][0], view.m[0][1], view.m[0][2], 0,
			//	-view.m[1][0], view.m[1][1], view.m[1][2], 0,
			//	view.m[2][0], -view.m[2][1], -view.m[2][2], 0,
			//	0, 0, 0, 1);
			//UMVec3d umeuler = umbase::um_matrix_to_euler_xyz(umrot.transposed());
			xformSample.setXRotation(umbase::um_to_degree(imeuler.y));
			xformSample.setYRotation(umbase::um_to_degree(imeuler.x));
			xformSample.setZRotation(-umbase::um_to_degree(imeuler.z));
		}
		else
		{
			xformSample.setRotation(quat.axis(), umbase::um_to_degree(quat.angle()));
		}

		xformSchema.set(xformSample);
	}
		
	Alembic::AbcGeom::OCamera camera;
	if (archive.camera_map.find(cameraKey) != archive.camera_map.end())
	{
		camera = archive.camera_map[cameraKey];
	}
	else
	{
		camera = Alembic::AbcGeom::OCamera(xform, "camera", archive.timesampling);
		archive.camera_map[cameraKey] = camera;
			
		Alembic::AbcGeom::OCameraSchema &cameraSchema = camera.getSchema();
		archive.camera_schema_map[cameraKey] = cameraSchema;
	}

	Alembic::AbcGeom::OCameraSchema &cameraSchema = archive.camera_schema_map[cameraKey];
	cameraSchema.setTimeSampling(archive.timesampling);
	Alembic::AbcGeom::CameraSample sample;

	D3DXVECTOR4 v;
	UMGetCameraFovLH(&v);

	sample.setNearClippingPlane(v.z);
	sample.setFarClippingPlane(v.w);

	double fovy = v.x;
	double aspect = v.y;
	double fovx = 2.0 * atan(tan(fovy / 2.0)*(aspect));
	double w = BridgeParameter::instance().frame_width / 10.0;
	double h = BridgeParameter::instance().frame_height / 10.0;
	double focalLength = w / (2.0 * tan(fovx / 2.0));

	sample.setHorizontalAperture(w / 10.0);
	sample.setVerticalAperture(h / 10.0);
	sample.setFocalLength(focalLength);

	cameraSchema.set(sample);
}