Ejemplo n.º 1
0
	void BMaxObject::UpdateGeometry()
	{
		SetGeometryDirty(false);
		if (m_pAnimatedMesh && m_pAnimatedMesh->IsLoaded())
		{
			Vector3 vMin, vMax;
			if (m_pAnimatedMesh->GetBoundingBox(&vMin, &vMax))
			{
				Matrix4 mat;
				GetLocalTransform(&mat);
				CShapeOBB obb(CShapeBox(vMin, vMax), mat);
				CShapeBox minmaxBox;
				minmaxBox.Extend(obb);
				if (GetScaling()!= 1.0){
					minmaxBox.SetMinMax(minmaxBox.GetMin() * GetScaling(), minmaxBox.GetMax() * GetScaling());
				}
				SetAABB(&minmaxBox.GetMin(), &minmaxBox.GetMax());
			}

			UnloadPhysics();
			if (m_dwPhysicsMethod == 0)
				m_dwPhysicsMethod = PHYSICS_LAZY_LOAD;
			else if (IsPhysicsEnabled() && ((m_dwPhysicsMethod&PHYSICS_ALWAYS_LOAD)>0))
			{
				LoadPhysics();
			}
		}
	}
Ejemplo n.º 2
0
void CoinAction::step(float time)
{
	if(_target)
	{
		_target->setRotation3D(Vec3(90,angle,180));
		angle+=time*140;
		_target->setPosition3D (_target->getPosition3D()+Vec3(0,0,100*time));
		if(_target->getPositionZ()>-40 && _target->getPositionZ()<10 )// enter the front
		{
            
			Sprite3D * sprite = dynamic_cast<Sprite3D * >(_target);
            OBB obb(sprite->getAABB());
      
			Vec3 vertices[8];
			auto player_aabb= player->getPlayer()->getAABB();
            auto dist =sprite->getPosition3D().distance(player->getPlayer()->getPosition3D());
            if(dist<5 && !is_triggered)
            {
                is_triggered =~is_triggered;
                sprite->setColor(Color3B(255,0,0));
                Effect::CoinEffect(render_node);
                auto a = (GameScene * )this->render_node;
                a->earnGold();
                CCLOG("get Money !!!");
                return ;
            }
		}
		if(_target->getPositionZ()>=10)
		{
			_target->removeFromParent();
			_target=nullptr;
		}
	}
}
void Deferred_lighting_renderer::render_light_probe(const scene::Light_probe& light_probe, const Rendering_context& context)
{
	const float4x4& world = light_probe.world_transformation();

	OBB obb(world);

	const auto& camera = context.camera();

	if (Intersection_type::Outside == camera.frustum().intersect(obb))
	{
		return;
	}

	Rendering_device& device = rendering_tool_.device();

	auto& change_per_light_data = change_per_light_.data();
	change_per_light_data.world = world;
	change_per_light_data.light_transformation = invert(world * camera.view());
	change_per_light_data.position_vs = light_probe.world_position() * camera.view();
	change_per_light_.update(device);

	device.set_shader_resources(1, &light_probe.texture(), light_probe_texture_offset_);

	techniques_.volume_light_probe_specular->use();

	if (Intersection_type::Outside != Sphere(camera.world_position(), camera.greatest_distance_to_near_plane()).intersect(obb))
	{
		// camera is inside the light volume

		device.set_rasterizer_state(lighting_rasterizer_states_[Cull_state::Front]);
		device.set_depth_stencil_state(inside_lighting_volume_ds_state_light_, 1);
	}
	else
	{
		// camera is outside the light volume

		device.set_rasterizer_state(lighting_rasterizer_states_[Cull_state::Back]);
		device.set_depth_stencil_state(outside_lighting_volume_ds_state_prepare_, 1);
		device.set_blend_state(z_only_blend_state_);

		box_volume_.render(rendering_tool_);

		device.set_rasterizer_state(lighting_rasterizer_states_[Cull_state::Front]);
		device.set_depth_stencil_state(outside_lighting_volume_ds_state_light_, 2);
	}

	device.set_blend_state(lighting_blend_state_);

	box_volume_.render(rendering_tool_);
}
  matrix_type orientation(iterator_t point_begin,
                          iterator_t point_end,
                          point_t& center) const {
    matrix<value_type, N, N> orientation;
    value_type tightest_volume = boost::numeric::bounds<value_type>::highest();

    for (int k = 0; k != _iterations; ++k) {
      matrix<value_type, N, N> random;

      point_t dir1 = generate_random_point();
      point_t dir2 = generate_random_point();
      point_t dir3 = generate_random_point();

      // use ortho-normal system
      dir1 /= dir1.length();
      dir2 /= dir2.length();
      dir3 /= dir3.length();

      // normalize
      dir3 = cross(dir1, dir2);
      dir2 = cross(dir1, dir3);

      random[0][0] = dir1[0];
      random[1][0] = dir1[1];
      random[2][0] = dir1[2];

      random[0][1] = dir2[0];
      random[1][1] = dir2[1];
      random[2][1] = dir2[2];

      random[0][2] = dir3[0];
      random[1][2] = dir3[1];
      random[2][2] = dir3[2];

      // compute volume according to temporary orientation
      point_t low, high;
      limits(point_begin, point_end, center, random, low, high);

      oriented_boundingbox<point_t> obb(random, center, low, high);
      value_type volume = obb.volume();

      // if tighter, apply
      if (volume < tightest_volume) {
        orientation = random;
        tightest_volume = volume;
      }
    }

    return orientation;
  }
Ejemplo n.º 5
0
void analyze::applyFilter(RichParameterSet* pars)
{
	starlab::LineSegments * bbox_lines = new starlab::LineSegments(1);
	std::vector<starlab::LineSegments*> dir_lines(3, new starlab::LineSegments(2));
	starlab::PolygonSoup * ps = new starlab::PolygonSoup;
	std::vector< std::vector<double> > colors = starlab::randomColors(12);

	mainWindow()->setStatusBarMessage("Finding connected pieces..");
	QApplication::processEvents();
	std::vector< SurfaceMesh::SurfaceMeshModel* > pieces = connectedPieces( mesh() );
	std::vector<Vector3> all_points;

	std::vector<MinOBB::OBB> obb( pieces.size() );

	mainWindow()->setStatusBarMessage("Finding OBBs..");
	QApplication::processEvents();
	QElapsedTimer timer; timer.start();

	if( pars->getBool("IsParallel") )
	{
		int N = pieces.size();

		#pragma omp parallel for
		for(int i = 0; i < N; i++)
		{
			Vector3VertexProperty points = pieces[i]->vertex_coordinates();
			std::vector<Vector3> all_points;
			for(auto v: pieces[i]->vertices()) all_points.push_back( points[v] );

			obb[i] = MinOBB::OBB( all_points, true );
		}
	}
	else
	{
		for(size_t pi = 0; pi < pieces.size(); pi++)
		{
			auto piece = pieces[pi];

			Vector3VertexProperty points = piece->vertex_coordinates();
			std::vector<Vector3> all_points;
			for(auto v: piece->vertices()) all_points.push_back( points[v] );

			bool isAddJitter = true;
			obb[pi] = MinOBB::OBB( all_points, isAddJitter );

			std::vector<Vector3> dir(3);
			for(int i = 0; i < 3; i++){
				dir[0][i] = obb[pi].bb.dir_1[i];
				dir[1][i] = obb[pi].bb.dir_2[i];
				dir[2][i] = obb[pi].bb.dir_3[i];
			}

			std::vector<Vector3> c = obb[pi].corners<Vector3>();

			bbox_lines->addLines( (QVector<Vector3>() << c[0] << c[1] << c[5] << c[4] << c[0]).toStdVector(), Qt::black );
			bbox_lines->addLines( (QVector<Vector3>() << c[0] << c[1] << c[3] << c[2] << c[0]).toStdVector(), Qt::black );
			bbox_lines->addLines( (QVector<Vector3>() << c[6] << c[7] << c[3] << c[2] << c[6]).toStdVector(), Qt::black );
			bbox_lines->addLines( (QVector<Vector3>() << c[6] << c[7] << c[5] << c[4] << c[6]).toStdVector(), Qt::black );

			Vector3 mean(0,0,0);
			for(auto p: c) mean += p;
			mean /= c.size();

			dir_lines[0]->addLine(mean, Vector3(mean + dir[0] * 0.5 * obb[pi].bb.length(0)), Qt::red);
			dir_lines[1]->addLine(mean, Vector3(mean + dir[1] * 0.5 * obb[pi].bb.length(1)), Qt::green);
			dir_lines[2]->addLine(mean, Vector3(mean + dir[2] * 0.5 * obb[pi].bb.length(2)), Qt::blue);

			if( pars->getBool("VisualizeBoxes") ){
				std::vector< std::vector<Vector3> > face = obb[pi].faces<Vector3>();
				for(size_t i = 0; i < face.size(); i++){
					ps->addPoly((QVector<starlab::QVector3>() << face[i][2] << face[i][1] << face[i][0]), QColor::fromRgbF(colors[i][0],colors[i][1],colors[i][2], 0.1));
				}
			}
		}
	}

	if( pars->getBool("Visualize") )
	{
		drawArea()->addRenderObject(bbox_lines);
		for(size_t i = 0; i < dir_lines.size(); i++) drawArea()->addRenderObject( dir_lines[i] );
		drawArea()->addRenderObject(ps);
	}

	mainWindow()->setStatusBarMessage( QString("Done finding OBBs. (%1 ms)").arg(timer.elapsed()));
	QApplication::processEvents();

	Structure::Graph * graph = new Structure::Graph();

	for(size_t bi = 0; bi < obb.size(); bi++)
	{
		MinOBB::OBB::OBBOX<Vector3> oi( obb[bi].bb );
		
		std::vector<Vector3> dir(3);
		for(int i = 0; i < 3; i++){
			dir[0][i] = obb[bi].bb.dir_1[i];
			dir[1][i] = obb[bi].bb.dir_2[i];
			dir[2][i] = obb[bi].bb.dir_3[i];
		}

		Vector3 delta = dir[2] * oi.HalfSize[2];

		Vector3 from = oi.Center + delta;
		Vector3 to = oi.Center - delta;

		NURBS::NURBSCurved curve = NURBS::NURBSCurved::createCurve(from, to);
		Structure::Curve * n = new Structure::Curve(curve, QString("node%1").arg(bi));

		graph->addNode( n );
	}

	mainWindow()->setStatusBarMessage("Now finding edges..");
	QApplication::processEvents();

	starlab::LineSegments * graphLines = new starlab::LineSegments(4);
	for(size_t i = 0; i < obb.size(); i++){
		MinOBB::OBB::OBBOX<Vector3> oi( obb[i].bb );
		for(size_t j = i + 1; j < obb.size(); j++){
			MinOBB::OBB::OBBOX<Vector3> oj( obb[j].bb );

			bool isIsect = MinOBB::OBB::testObbObb<Vector3>( oi, oj );
			if( isIsect ) 
			{
				graph->addEdge(QString("node%1").arg(i), QString("node%1").arg(j));

				if( pars->getBool("VisualizeGraph") )
					graphLines->addLine( oi.Center, oj.Center, Qt::magenta );
			}
		}
	}

	drawArea()->addRenderObject( graphLines );

	graph->saveToFile("graph.xml");
}
		//------------------------------------------------------------------------
		bool Capsule::intersects( const Aabb& aabb ) const
		{
			// TODO: optimize this code for the AABB case.
			OrientedBox obb( aabb );
			return intersects( obb );
		}