47 #include <OgrePlane.h>
49 #include <OgreSceneNode.h>
50 #include <OgreViewport.h>
85 setStatus(
"Click and on a mesh_msgs::TriangleMesh to set the position and drag the mouse for the orientation." );
102 Ogre::Vector3 pos, ori;
111 else if( event.
type == QEvent::MouseMove && event.
left() )
115 Ogre::Vector3 cur_pos;
118 plane, event.
x, event.
y, cur_pos ))
123 Ogre::Vector3 z_axis = - (cur_pos -
pos_);
124 Ogre::Vector3 y_axis =
ori_;
125 Ogre::Vector3 x_axis = y_axis.crossProduct( z_axis );
142 Ogre::Vector3 cur_pos;
145 plane, event.
x, event.
y, cur_pos ))
148 Ogre::Vector3 z_axis = - (cur_pos -
pos_);
149 Ogre::Vector3 y_axis =
ori_;
150 Ogre::Vector3 x_axis = y_axis.crossProduct( z_axis );
168 Ogre::Ray ray =
event.viewport->getCamera()->getCameraToViewportRay
169 ((
float) event.
x / event.
viewport->getActualWidth(),
170 (
float) event.
y / event.
viewport->getActualHeight());
172 Ogre::RaySceneQuery* query =
context_->
getSceneManager()->createRayQuery(ray, Ogre::SceneManager::WORLD_GEOMETRY_TYPE_MASK);
173 query->setSortByDistance(
true);
175 Ogre::RaySceneQueryResult& result = query->execute();
177 for (
size_t i=0; i<result.size(); i++)
179 if(result[i].movable->getName().find(
"TriangleMesh") != std::string::npos){
180 Ogre::ManualObject* mesh =
static_cast<Ogre::ManualObject*
>(result[i].movable);
181 size_t goal_section = -1;
182 size_t goal_index = -1;
183 Ogre::Real dist = -1;
195 const Ogre::ManualObject* mesh,
196 const Ogre::Ray &ray,
197 Ogre::Vector3& position,
198 Ogre::Vector3& orientation)
200 Ogre::Real dist = -1.0f;
201 Ogre::Vector3 a, b, c;
203 size_t vertex_count = 0;
204 Ogre::Vector3* vertices;
205 size_t index_count = 0;
206 unsigned long* indices;
207 size_t num_sections = mesh->getNumSections();
209 for (
size_t i = 0; i < num_sections; i++)
214 for (
size_t j = 0; j < index_count; j += 3)
216 std::pair<bool, Ogre::Real> goal =
217 Ogre::Math::intersects(
219 vertices[indices[j]],
220 vertices[indices[j + 1]],
221 vertices[indices[j + 2]],
227 if ((dist < 0.0
f) || (goal.second < dist))
230 a = vertices[indices[j]];
231 b = vertices[indices[j + 1]];
232 c = vertices[indices[j + 2]];
242 position = ray.getPoint(dist);
243 Ogre::Vector3 ab = b-a;
244 Ogre::Vector3 ac = c-a;
245 orientation = ac.crossProduct(ab).normalisedCopy();
253 const Ogre::ManualObject *mesh,
254 const size_t sectionNumber,
256 Ogre::Vector3*& vertices,
258 unsigned long*& indices
260 Ogre::VertexData* vertexData;
261 const Ogre::VertexElement* vertexElement;
262 Ogre::HardwareVertexBufferSharedPtr vertexBuffer;
263 unsigned char* vertexChar;
266 vertexData = mesh->getSection(sectionNumber)->getRenderOperation()->vertexData;
267 vertexElement = vertexData->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION);
268 vertexBuffer = vertexData->vertexBufferBinding->getBuffer(vertexElement->getSource());
269 vertexChar =
static_cast<unsigned char*
>(vertexBuffer->lock(Ogre::HardwareBuffer::HBL_READ_ONLY));
271 vertexCount = vertexData->vertexCount;
272 vertices =
new Ogre::Vector3[vertexCount];
274 for (
size_t i = 0; i < vertexCount; i++, vertexChar += vertexBuffer->getVertexSize())
276 vertexElement->baseVertexPointerToElement(vertexChar, &vertexFloat);
277 vertices[i] = (mesh->getParentNode()->_getDerivedOrientation() *
278 (Ogre::Vector3(vertexFloat[0], vertexFloat[1], vertexFloat[2]) * mesh->getParentNode()->_getDerivedScale())) +
279 mesh->getParentNode()->_getDerivedPosition();
282 vertexBuffer->unlock();
284 Ogre::IndexData* indexData;
285 Ogre::HardwareIndexBufferSharedPtr indexBuffer;
286 indexData = mesh->getSection(sectionNumber)->getRenderOperation()->indexData;
287 indexCount = indexData->indexCount;
288 indices =
new unsigned long[indexCount];
289 indexBuffer = indexData->indexBuffer;
290 unsigned int* pLong =
static_cast<unsigned int*
>(indexBuffer->lock(Ogre::HardwareBuffer::HBL_READ_ONLY));
291 unsigned short* pShort =
reinterpret_cast<unsigned short*
>(pLong);
293 for (
size_t i = 0; i < indexCount; i++)
296 if (indexBuffer->getType() == Ogre::HardwareIndexBuffer::IT_32BIT)
298 index =
static_cast<unsigned long>(pLong[i]);
303 index =
static_cast<unsigned long>(pShort[i]);
308 indexBuffer->unlock();