Unigine::PhysicsIntersectionNormal Class
Header: | #include <UniginePhysics.h> |
Inherits: | PhysicsIntersection |
This class stores all information on the point of physics intersection (coordinates of the intersection, the shape of the object, the index of the surface) plus the normal coordinates at this point.
Usage Example#
The following example shows how you can get the normal of the intersection point by using the PhysicsIntersectionNormal class. In this example the line is an invisible traced line from the point of the camera (vec3 p0) to the point of the mouse pointer (vec3 p1). The executing sequence is the following:
- Define and initialize two points (p0 and p1) by using the Player::getDirectionFromScreen() function.
- Create an instance of the PhysicsIntersectionNormal class to get the normal of the intersection point.
- Check, if there is a intersection with an object.
- In this example, when the object intersects with the traced line, all the surfaces of the intersected object change their material parameters. The PhysicsIntersectionNormal class instance gets the normal of the intersection point. You can get it by using getNormal() function.
// AppWorldLogic.cpp
#include <UnigineEditor.h>
#include <UniginePhysics.h>
#include <UnigineGame.h>
#include <UnigineApp.h>
#include <UnigineObjects.h>
using namespace Unigine;
using namespace Math;
int AppWorldLogic::init() {
// create a mesh instance with a box surface
MeshPtr mesh = Mesh::create();
mesh->addBoxSurface("box", vec3(0.2f));
// create a new dynamic mesh from the Mesh instance
ObjectMeshDynamicPtr dynamic_mesh = ObjectMeshDynamic::create(mesh);
// assign a material to the dynamic mesh
dynamic_mesh->setWorldTransform(translate(Vec3(0.0f, 0.0f, 2.0f)));
dynamic_mesh->setMaterial("mesh_base", "*");
// assign a body and a shape to the dynamic mesh
BodyRigidPtr body = BodyRigid::create(dynamic_mesh);
ShapeBoxPtr shape = ShapeBox::create(body, vec3(0.2f));
return 1;
}
// start of the main loop
int AppWorldLogic::update() {
// initialize points of the mouse direction
Vec3 p0, p1;
// get the current player (camera)
PlayerPtr player = Game::getPlayer();
if (player.get() == NULL)
return 0;
// get width and height of the current application window
int width = App::getWidth();
int height = App::getHeight();
// get the current X and Y coordinates of the mouse pointer
int mouse_x = App::getMouseX();
int mouse_y = App::getMouseY();
// get the mouse direction from the player's position (p0) to the mouse cursor pointer (p1)
player->getDirectionFromScreen(p0, p1, mouse_x, mouse_y, width, height);
// create the instance of the PhysicsIntersectionNormal object to save the information about the intersection
PhysicsIntersectionNormalPtr intersection = PhysicsIntersectionNormal::create();
// get an intersection
ObjectPtr object = Physics::getIntersection(p0, p1, 1, intersection);
// if the intersection has been occurred, change the parameter of the object's material
if (object)
{
for (int i = 0; i < object->getNumSurfaces(); i++)
{
object->setMaterialParameter("albedo_color", vec4(1.0f, 1.0f, 0.0f, 1.0f), i);
}
// if the intersected object has a shape, show the information about the intersection normal
ShapePtr shape = intersection->getShape();
if (shape)
{
Log::message("Normal: type %s coordinates (%f %f %f)\n", typeid(intersection->getNormal()).name(),
intersection->getNormal().x,
intersection->getNormal().y,
intersection->getNormal().z);
}
}
return 1;
}
PhysicsIntersectionNormal Class
Members
static PhysicsIntersectionNormalPtr create ( ) #
The PhysicsIntersectionNormal constructor.void setNormal ( const Math::vec3 & normal ) #
Sets the new normal of the intersection point.Arguments
- const Math::vec3 & normal - Normal of the intersection point.
Math::vec3 getNormal ( ) #
Returns the normal of the intersection point.Return value
Normal of the intersection point.Last update:
2019-12-25
Help improve this article
Was this article helpful?
(or select a word/phrase and press Ctrl+Enter)