void SimpleEntityVisualization::updatePositionAndOrientation() { if (mEntity.getPredictedPos().isValid()) { mSceneNode->setPosition(Convert::toOgre(mEntity.getPredictedPos())); mVelocitySceneNode->setPosition(Convert::toOgre(mEntity.getPredictedPos())); } if (mEntity.getOrientation().isValid()) { mSceneNode->setOrientation(Convert::toOgre(mEntity.getOrientation())); } if (mEntity.getVelocity().isValid() && mEntity.getVelocity() != WFMath::Vector<3>::ZERO()) { mVelocitySceneNode->setVisible(true); WFMath::Quaternion q; q.identity(); q.rotation(WFMath::Vector<3>(-1, 0, 0), mEntity.getVelocity(), WFMath::Vector<3>(0, 0, 1)); if (q.isValid()) { mVelocitySceneNode->setOrientation(Convert::toOgre(q)); } else { mVelocitySceneNode->setVisible(false); } } else { mVelocitySceneNode->setVisible(false); } }
void Steering::moveInDirection(const WFMath::Vector<2>& direction) { WFMath::Vector<3> fullDirection(direction.x(), 0, direction.y()); WFMath::Quaternion orientation; if (direction != WFMath::Vector<2>::ZERO()) { orientation.rotation(WFMath::Vector<3>(0, 0, 1), WFMath::Vector<3>(fullDirection).normalize(), WFMath::Vector<3>(0, 1, 0)); } mAvatar.moveInDirection(fullDirection, orientation); mLastSentVelocity = direction; mExpectingServerMovement = true; }
void Steering::moveToPoint(const WFMath::Point<3>& point) { auto entity3dPosition = mAvatar.getEntity()->getViewPosition(); WFMath::Vector<3> vel = point - entity3dPosition; WFMath::Quaternion orientation; if (vel != WFMath::Vector<3>::ZERO()) { orientation.rotation(WFMath::Vector<3>(0, 0, 1), WFMath::Vector<3>(vel).normalize(), WFMath::Vector<3>(0, 1, 0)); } mAvatar.moveToPoint(point, orientation); mLastSentVelocity = WFMath::Vector<2>(vel.x(), vel.z()); mExpectingServerMovement = true; }
void EntityMaker::createEntityOfType(Eris::TypeInfo* typeinfo, const std::string& parentEntityId, const std::string& name) { Atlas::Objects::Operation::Create c; c->setFrom(mAvatar.getId()); //if the avatar is a "creator", i.e. and admin, we will set the TO property //this will bypass all of the server's filtering, allowing us to create any entity and have it have a working mind too if (mAvatar.getIsAdmin()) { c->setTo(mAvatar.getEntityId()); } Atlas::Message::MapType msg; msg["loc"] = parentEntityId; WFMath::Point<3> pos = WFMath::Point<3>::ZERO(); WFMath::Quaternion orientation = WFMath::Quaternion::Identity(); //Only place it if we're creating the new entity in the same location as the avatar if (parentEntityId == mAvatar.getEntity()->getLocation()->getId()) { //Place the new entity two meters in front of the avatar. WFMath::Vector<3> vector(0, 0, 2); //We need to constraint the orientation to only around the y axis. WFMath::Vector<3> rotator(0.0, 0.0, 1.0f); rotator.rotate(mAvatar.getEntity()->getOrientation()); auto atan = std::atan2(rotator.x(), rotator.z()); orientation.rotation(1, atan); pos = mAvatar.getEntity()->getPosition() + (vector.rotate(orientation)); } msg["pos"] = pos.toAtlas(); msg["orientation"] = orientation.toAtlas(); if (!name.empty()) { msg["name"] = name; } msg["parent"] = typeinfo->getName(); c->setArgsAsList(Atlas::Message::ListType(1, msg)); mConnection.send(c); std::stringstream ss; ss << pos; S_LOG_INFO("Trying to create entity of type " << typeinfo->getName() << " at position " << ss.str()); }