46 #include <OgrePlane.h>
48 #include <OgreSceneNode.h>
49 #include <OgreViewport.h>
80 setStatus(
"Click and on a mesh_msgs::TriangleMesh to set the position and drag the mouse for the orientation.");
97 Ogre::Vector3 pos, ori;
107 else if (event.
type == QEvent::MouseMove && event.
left())
111 Ogre::Vector3 cur_pos;
118 Ogre::Vector3 z_axis = -(cur_pos -
pos_);
119 Ogre::Vector3 y_axis =
ori_;
120 Ogre::Vector3 x_axis = y_axis.crossProduct(z_axis);
137 Ogre::Vector3 cur_pos;
142 Ogre::Vector3 z_axis = -(cur_pos -
pos_);
143 Ogre::Vector3 y_axis =
ori_;
144 Ogre::Vector3 x_axis = y_axis.crossProduct(z_axis);
161 Ogre::Vector3& triangle_normal)
163 Ogre::Ray ray =
event.viewport->getCamera()->getCameraToViewportRay(
164 (
float)event.
x / event.
viewport->getActualWidth(), (
float)event.
y / event.
viewport->getActualHeight());
166 Ogre::RaySceneQuery* query =
168 query->setSortByDistance(
true);
170 Ogre::RaySceneQueryResult& result = query->execute();
172 for (
size_t i = 0; i < result.size(); i++)
174 if (result[i].movable->getName().find(
"TriangleMesh") != std::string::npos)
176 Ogre::ManualObject*
mesh =
static_cast<Ogre::ManualObject*
>(result[i].movable);
177 size_t goal_section = -1;
178 size_t goal_index = -1;
179 Ogre::Real dist = -1;
190 Ogre::Vector3& position, Ogre::Vector3& orientation)
192 Ogre::Real dist = -1.0f;
193 Ogre::Vector3 a, b, c;
195 size_t vertex_count = 0;
196 Ogre::Vector3* vertices;
197 size_t index_count = 0;
198 unsigned long* indices;
199 size_t num_sections =
mesh->getNumSections();
201 for (
size_t i = 0; i < num_sections; i++)
204 if (index_count != 0)
206 for (
size_t j = 0; j < index_count; j += 3)
208 std::pair<bool, Ogre::Real> goal = Ogre::Math::intersects(ray, vertices[indices[j]], vertices[indices[j + 1]],
209 vertices[indices[j + 2]],
true,
true);
213 if ((dist < 0.0
f) || (goal.second < dist))
216 a = vertices[indices[j]];
217 b = vertices[indices[j + 1]];
218 c = vertices[indices[j + 2]];
229 position = ray.getPoint(dist);
230 Ogre::Vector3 ab = b - a;
231 Ogre::Vector3 ac = c - a;
232 orientation = ac.crossProduct(ab).normalisedCopy();
242 size_t& vertexCount, Ogre::Vector3*& vertices,
size_t& indexCount,
243 unsigned long*& indices)
245 Ogre::VertexData* vertexData;
246 const Ogre::VertexElement* vertexElement;
247 Ogre::HardwareVertexBufferSharedPtr vertexBuffer;
248 unsigned char* vertexChar;
251 vertexData =
mesh->getSection(sectionNumber)->getRenderOperation()->vertexData;
252 vertexElement = vertexData->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION);
253 vertexBuffer = vertexData->vertexBufferBinding->getBuffer(vertexElement->getSource());
254 vertexChar =
static_cast<unsigned char*
>(vertexBuffer->lock(Ogre::HardwareBuffer::HBL_READ_ONLY));
256 vertexCount = vertexData->vertexCount;
257 vertices =
new Ogre::Vector3[vertexCount];
259 for (
size_t i = 0; i < vertexCount; i++, vertexChar += vertexBuffer->getVertexSize())
261 vertexElement->baseVertexPointerToElement(vertexChar, &vertexFloat);
263 (
mesh->getParentNode()->_getDerivedOrientation() *
264 (Ogre::Vector3(vertexFloat[0], vertexFloat[1], vertexFloat[2]) *
mesh->getParentNode()->_getDerivedScale())) +
265 mesh->getParentNode()->_getDerivedPosition();
268 vertexBuffer->unlock();
270 Ogre::IndexData* indexData;
271 Ogre::HardwareIndexBufferSharedPtr indexBuffer;
272 indexData =
mesh->getSection(sectionNumber)->getRenderOperation()->indexData;
273 indexCount = indexData->indexCount;
274 indices =
new unsigned long[indexCount];
275 indexBuffer = indexData->indexBuffer;
276 unsigned int* pLong =
static_cast<unsigned int*
>(indexBuffer->lock(Ogre::HardwareBuffer::HBL_READ_ONLY));
277 unsigned short* pShort =
reinterpret_cast<unsigned short*
>(pLong);
279 for (
size_t i = 0; i < indexCount; i++)
282 if (indexBuffer->getType() == Ogre::HardwareIndexBuffer::IT_32BIT)
284 index =
static_cast<unsigned long>(pLong[i]);
289 index =
static_cast<unsigned long>(pShort[i]);
294 indexBuffer->unlock();