VoxRaytracer::RayData VoxRaytracer::TraceBetweenPoints(const Vector4f &in, const Vector4f &out) const { RayData ray; Vector4f pt1 = m_Image->GetLocalPoint(in); Vector4f pt2 = m_Image->GetLocalPoint(out); Vector4f s = pt2 - pt1; Vector3f scale; // FIXXX scale << (m_Image->GetWorldMatrix() * Vector4f(1,0,0,0)).norm(), (m_Image->GetWorldMatrix() * Vector4f(0,1,0,0)).norm(), (m_Image->GetWorldMatrix() * Vector4f(0,0,1,0)).norm(); float l = s.head(3).norm(); Vector3f L(l/s(0), l/s(1), l/s(2)); Vector3f offset; for(int i=0;i<3;++i) offset(i) = (s(i)>=0) - (pt1(i)-floor(pt1(i))) ; offset = offset.cwiseProduct(L).cwiseAbs(); L = L.cwiseAbs(); int id; float d; Vector3i vid = m_Image->Find(in); while(l>0) { d = offset.minCoeff(&id); if(m_Image->IsInsideGrid(vid)) ray.AddElement(m_Image->Map(vid), d * scale(id) ); // nan check // // if(unlikely(!isFinite(d * scale(id)))) { // std:: cout << "NAN in raytracer\n"; // exit(1); // } vid(id) += (int)fast_sign(s(id)); l -= d; offset.array() -= d; offset(id) = fmin(L(id),l); } return ray; }
/** * @brief Updates the position and rotation every time step dt. * * @param dt The steptime, the time since the last drawn frame. * * @return void */ void Camera::update(float dt) { glm::vec4 dir = glm::vec4(0,0,1,0); glm::mat4x4 mDir = glm::rotate(glm::mat4(),-_rotation[0],glm::vec3(0.0f,1.0f,0.0f)); glm::mat4x4 mSide = glm::rotate(glm::mat4(),90.0f,glm::vec3(0.0f,1.0f,0.0f)); dir = mDir * dir; glm::vec4 side = mSide * dir; glm::vec3 force; if(_movingForward && !_movingBackward) { force -= glm::vec3(dir[0],dir[1],dir[2]); } if(!_movingForward && _movingBackward) { force += glm::vec3(dir[0],dir[1],dir[2]); } if(_movingLeft && !_movingRight) { force -= glm::vec3(side[0],side[1],side[2]); } if(!_movingLeft && _movingRight) { force += glm::vec3(side[0],side[1],side[2]); } if(!_movingUp && _movingDown) { force += glm::vec3(0,1,0); } if(_movingUp && !_movingDown) { force -= glm::vec3(0,1,0); } _velocity += force*(dt*_acceleration); _position += _velocity*dt; float m = glm::length(_velocity); if(m!=0){ glm::vec3 velDir = glm::normalize(_velocity); _velocity -= velDir*dt*_deacceleration; } if(m<0.001) _velocity = glm::vec3(0,0,0); if(m>_speed) _velocity *= _speed/m; float sign; _rotVelocityV += _rotForceV*(dt*_rotationAcceleration); sign = fast_sign(_rotVelocityV); _rotVelocityV -= sign*dt*_rotationDeacceleration; if(fabs(_rotVelocityV)>_rotationSpeed) _rotVelocityV = sign*_rotationSpeed; if(fabs(_rotVelocityV)<0.1){ _rotVelocityV = 0; } _rotation.y += _rotVelocityV*dt; _rotForceV = 0; _rotVelocityH += _rotForceH*(dt*_rotationAcceleration); sign = fast_sign(_rotVelocityH); _rotVelocityH -= sign*dt*_rotationDeacceleration; if(fabs(_rotVelocityH)>_rotationSpeed) _rotVelocityH = sign*_rotationSpeed; if(fabs(_rotVelocityH)<0.1){ _rotVelocityH = 0; } _rotation.x += _rotVelocityH*dt; _rotForceH = 0; glm::vec3 headPos = sgct::Engine::getUserPtr()->getPos(); if(_rotation[1]<-89) { _rotation[1] = -89; } if(_rotation[1]>89) { _rotation[1] = 89; } //glm::vec4 worldRect = ImmersiveKidz::getInstance()->getWorldRect(); if(_position.x+headPos.x < _limitsX.x) _position.x = _limitsX.x-headPos.x; if(_position.x+headPos.x > _limitsX.y) _position.x = _limitsX.y-headPos.x; if(_position.y+headPos.y < _limitsY.x) _position.y = _limitsY.x-headPos.y; if(_position.y+headPos.y > _limitsY.y) _position.y = _limitsY.y-headPos.y; if(_position.z+headPos.z < _limitsZ.x) _position.z = _limitsZ.x-headPos.z; if(_position.z+headPos.z > _limitsZ.y) _position.z = _limitsZ.y-headPos.z; _viewMatrix = glm::mat4(); _viewMatrix = glm::translate(_viewMatrix,headPos); _viewMatrix = glm::rotate(_viewMatrix,_rotation[1],glm::vec3(1.0f,0.0f,0.0f)); _viewMatrix = glm::rotate(_viewMatrix,_rotation[0],glm::vec3(0.0f,1.0f,0.0f)); _viewMatrix = glm::translate(_viewMatrix,-_position); _viewMatrix = glm::translate(_viewMatrix,-headPos); }