VEC3F rayColor(VEC3F* ray) { VEC3F colorRGB; VEC3F c(0, 0, 1); // sphere center VEC3F n; // normal vector VEC3F cr(1.0f, 1.0f, 1.0f); // surface color VEC3F cl(1.0f, 1.0f, 1.0f); // light color VEC3F light(1, 1, -1); // light location VEC3F l; // light direction if(!intersectScene(ray[0])) { //return black colorRGB = VEC3F(0.f, 0.f, 0.f); } else { // return color n = ray[0]-c; // calculate normal vector, p - c l = light-ray[0]; // calculate l vector, light - p // normalize n and l n.normalize(); l.normalize(); VEC3F crcl(cr[0]*cl[0], cr[1]*cl[1], cr[2]*cl[2]); float nlDotProd = n*l; colorRGB = crcl*(nlDotProd); } return colorRGB; // return vector with rgb values }
MATRIX3 SPHERE::springJacobian(const VEC3F& collisionPoint) { VEC3F direction = collisionPoint - _center; Real dot = direction.dot(direction); Real sqrtDot = sqrt(dot); //Real invSqrtDot = 1.0 / sqrtDot; MATRIX3 final; final.setZero();
////////////////////////////////////////////////////////////////////// // compute the tet volume ////////////////////////////////////////////////////////////////////// Real TET::volume() { // formula for a tet volume with vertices (a,b,c,d) is: // |(a - d) dot ((b - d) cross (c - d))| / 6 VEC3F a = (*vertices[1]) - (*vertices[0]); VEC3F b = (*vertices[2]) - (*vertices[0]); VEC3F c = (*vertices[3]) - (*vertices[0]); return fabs(a.dot(b.cross(c)) / 6.0); }
VEC3F SPHERE::force(const VEC3F& collisionPoint, const VEC3F& collisionVelocity) { VEC3F direction = collisionPoint - _center; VEC3F normal = direction; normal.normalize(); Real velocityDot = normal.dot(collisionVelocity); VEC3F springForce = _collisionStiffness * (direction - (normal * _radius)); VEC3F dampingForce = _collisionDamping * normal * velocityDot; return springForce + dampingForce; }
int main() { float f(0.5); VEC4F v(3.0); VEC4F t(VEC3F(4.0,.8,1.6), 3.2); VEC4F y(t); VEC4F c(1.0,0.5,0.25,0.65); VEC3F a = v.getVEC3F(); VEC3F b = y.getVEC3F(); cout<<"first vector v: "<<v<<endl; cout<<"second vector t: "<<t<<endl; cout<<"third vector y: "<<y<<endl; cout<<"fourth vector c "<<c<<endl; cout<<"fifth vector a: "<<a<<endl; cout<<"sixth vector b: "<<b<<endl<<endl; cout<<"item 3 of vector "<<y<<" is "<<y[3]<<endl; cout<<"change this item to "<<y[0]<<": "; y[3]=y[0]; cout<<y<<endl<<endl; cout<<v<<" + "<<c<<" = "<<v+c<<endl; cout<<v<<" - "<<c<<" = "<<v-c<<endl; cout<<"-"<<v<<" = "<<-v<<endl; cout<<v<<" * "<<c<<" = "<<v*c<<endl; cout<<f<<" * "<<c<<" = "<<f*c<<endl; cout<<v<<" / "<<c<<" = "<<v/c<<endl; cout<<c<<" / "<<f<<" = "<<c/f<<endl<<endl; cout<<v<<" += "<<c<<" : "; v+=c; cout<<v<<endl; cout<<v<<" -= "<<c<<" : "; v-=c; cout<<v<<endl; cout<<v<<" *= "<<c<<" : "; v*=c; cout<<v<<endl; cout<<c<<" *= "<<f<<" : "; c*=f; cout<<c<<endl; cout<<v<<" /= "<<c<<" : "; v/=c; cout<<v<<endl; cout<<c<<" /= "<<f<<" : "; c/=f; cout<<c<<endl<<endl; cout<<a<<" cross "<<b<<" = "<<cross(a,b)<<endl; cout<<a<<" dot "<<b<<" = "<<dot(a,b)<<endl; cout<<a<<" normalized = "<<a.getNormalized()<<endl; cout<<"normalized "<<a<<" = "; a.normalize(); cout<<a<<endl; cout<<a<<" magnitude = "<<a.getMagnitude()<<endl; cout<<b<<" magnitude = "<<b.getMagnitude()<<endl; };
int SceneLoader::load(string scene_file, Scene** scene, int xRes, int yRes) { TiXmlDocument doc(scene_file); if ( !doc.LoadFile() ) { Logger::log(LOG_ERROR) << "Scene loading failed : " << scene_file << endl; Logger::log(LOG_ERROR) << "Error #" << doc.ErrorId() << " : " << doc.ErrorDesc() << endl; return -1; } else { Logger::log(LOG_INFO) << "Start loading scene : " << scene_file << endl; Uint32 initial_tick = SDL_GetTicks(); list<Object*> objects; list<Light*> lights; set<Material*> materials; AmbientLight ambientLight; Camera* camera=0; TiXmlElement* tmp_node = 0; TiXmlHandle hdl(&doc); TiXmlElement* node = hdl.FirstChildElement().FirstChildElement().Element(); if (node == NULL) { Logger::log(LOG_ERROR)<<"Error on top of the file"<<endl; return -1; } while ( node ) { string nodeName(node->Value()); if ( nodeName.compare("camera")==0 ) { VEC3F position, target, normal; float w = 8, d = 35; tmp_node = node->FirstChildElement("position"); if (tmp_node == NULL) { Logger::log(LOG_ERROR)<<"Missing <position> near line "<<node->Row()<<endl; } else { position = readVec3Float(tmp_node); } tmp_node = node->FirstChildElement("target"); if (tmp_node == NULL) { Logger::log(LOG_ERROR)<<"Missing <target> near line "<<node->Row()<<endl; } else { target = readVec3Float(tmp_node); } tmp_node = node->FirstChildElement("normal"); if (tmp_node == NULL) { Logger::log(LOG_ERROR)<<"Missing <normal> near line "<<node->Row()<<endl; } else { normal = readVec3Float(tmp_node); } tmp_node = node->FirstChildElement("viewplane"); if (tmp_node == NULL) { Logger::log(LOG_ERROR)<<"Missing <viewplane> near line "<<node->Row()<<endl; } else { tmp_node->QueryFloatAttribute("w", &w); tmp_node->QueryFloatAttribute("d", &d); } camera = new Camera(position, target-position, normal, w, d, xRes, yRes, Settings::getAsFloat("camera_translation_factor"), Settings::getAsFloat("camera_rotation_angle")); } else if ( nodeName.compare("directionalLight")==0 ) { Color color; VEC3F direction; tmp_node = node->FirstChildElement("color"); if (tmp_node == NULL) { Logger::log(LOG_ERROR)<<"Missing <color> near line "<<node->Row()<<endl; } else { color = readColor(tmp_node); } tmp_node = node->FirstChildElement("direction"); if (tmp_node == NULL) { Logger::log(LOG_ERROR)<<"Missing <direction> near line "<<node->Row()<<endl; } else { direction = readVec3Float(tmp_node); } DirectionalLight *dirLight = new DirectionalLight(color, direction.normalize()); // !!!!!!!!!! NEEDS TO BE DESTROYED lights.push_back(dirLight); } else if ( nodeName.compare("pointLight")==0 ) { Color color; VEC3F point; tmp_node = node->FirstChildElement("color"); if (tmp_node == NULL) { Logger::log(LOG_ERROR)<<"Missing <color> near line "<<node->Row()<<endl; } else { color = readColor(tmp_node); } tmp_node = node->FirstChildElement("point"); if (tmp_node == NULL) { Logger::log(LOG_ERROR)<<"Missing <point> near line "<<node->Row()<<endl; } else { point = readVec3Float(tmp_node); } PointLight *pointLight = new PointLight(color, point); // !!!!!!!!!! NEEDS TO BE DESTROYED lights.push_back(pointLight); } else if ( nodeName.compare("ambientLight")==0 ) { Color color; tmp_node = node->FirstChildElement("color"); if (tmp_node == NULL) { Logger::log(LOG_ERROR)<<"Missing <color> near line "<<node->Row()<<endl; } else { color = readColor(tmp_node); } ambientLight = AmbientLight(color); } else if ( nodeName.compare("object")==0 ) { Material* material = 0; tmp_node = node->FirstChildElement("material"); if (tmp_node == NULL) { Logger::log(LOG_ERROR)<<"Missing <material> near line "<<node->Row()<<endl; } else { material = readMaterial(tmp_node); if (material != NULL) { if (materials.count(material) == 0) { materials.insert(material); } } } tmp_node = node->FirstChildElement("shape"); if (tmp_node == NULL) { Logger::log(LOG_ERROR)<<"Missing <shape> near line "<<node->Row()<<endl; } else { readShape(tmp_node->FirstChildElement(), &objects, material); } } else { Logger::log(LOG_ERROR)<<"Unknown primary node line "<<node->Row()<<endl; } node = node->NextSiblingElement(); } float loading_time=(SDL_GetTicks()-initial_tick)/(float)1000; Logger::log(LOG_INFO) << "Scene loaded ("<<(int) objects.size()<<" objects) (" << loading_time << " s)" << endl; *scene = new Scene(objects,lights,materials,ambientLight,camera); return 0; } }
void SceneLoader::readShape(TiXmlElement* node, list<Object*>* objects, Material* material) { string nodeName(node->Value()); if ( nodeName.compare("sphere")==0 ) { VEC3F center = readVec3Float(node->FirstChildElement("center")); float radius = 0; node->FirstChildElement("radius")->QueryFloatAttribute("v", &radius); #ifdef SCENELOADER_DEBUG Logger::log(LOG_DEBUG)<<"Sphere : ("<<center.x<<","<<center.y<<","<<center.z<<") " <<radius<<endl; #endif objects->push_back(new Sphere(center, radius, material)); } else if ( nodeName.compare("triangle")==0 ) { VEC3F a = readVec3Float(node->FirstChildElement("a")); VEC3F b = readVec3Float(node->FirstChildElement("b")); VEC3F c = readVec3Float(node->FirstChildElement("c")); TiXmlElement* child_normal_a = node->FirstChildElement("normal_a"); TiXmlElement* child_normal_b = node->FirstChildElement("normal_b"); TiXmlElement* child_normal_c = node->FirstChildElement("normal_c"); VEC3F na; VEC3F nb; VEC3F nc; VEC3F normal = ((b - a) * (b - c)).normalize(); if(child_normal_a != NULL) { na = readVec3Float(child_normal_a); } else { na = normal; } if(child_normal_b != NULL) { nb = readVec3Float(child_normal_b); } else { nb = normal; } if(child_normal_c != NULL) { nc = readVec3Float(child_normal_c); } else { nc = normal; } #ifdef SCENELOADER_DEBUG Logger::log(LOG_DEBUG)<<"Triangle : ("<<a.x<<","<<a.y<<","<<a.z<<") (" <<b.x<<","<<b.y<<","<<b.z<<") (" <<c.x<<","<<c.y<<","<<c.z<<")"<<endl; #endif Triangle* tr = new Triangle(a, b, c, na, nb, nc, normal, material); objects->push_back(tr); } else if ( nodeName.compare("list")==0 ) { TiXmlElement* child = node->FirstChildElement(); while ( child ) { readShape(child, objects, material); child = child->NextSiblingElement(); } } else if(nodeName.compare("plane")==0) { VEC3F normal = readVec3Float(node->FirstChildElement("normal")); VEC3F point = readVec3Float(node->FirstChildElement("point")); objects->push_back(new Plane(normal.normalize(), point, material)); } else { Logger::log(LOG_ERROR)<<"Unknown shape : "<<nodeName<<" (line "<<node->Row()<<")"<<endl; } }
VEC3F SPHERE::contactPoint(const VEC3F& point) { VEC3F normal = point - _center; normal.normalize(); return _center + (normal * _radius); }
bool vcylinder::define() { glList = glGenLists(1); glNewList(glList, GL_COMPILE); glShadeModel(GL_FLAT); float angle = (float)(15 * (M_PI / 180)); int iter = (int)(360 / 15); float h_len = length * 0.5f; VEC3F to = VEC3F(pb[0] - origin[0], pb[1] - origin[1], pb[2] - origin[2]); VEC3F u = to / to.length(); double th = M_PI * 0.5; double ap = acos(u.z); double xi = asin(-u.y); if (ap > M_PI) ap = ap - M_PI; ang[0] = 180 * xi / M_PI; ang[1] = 180 * th / M_PI; ang[2] = 180 * ap / M_PI; EPD ep; ep.setFromEuler(xi, th, ap); glPushMatrix(); glBegin(GL_TRIANGLE_FAN); { VEC3D p = VEC3D( 0.f, length * 0.5f, 0.f ); glColor3f(0.0f, 0.f, 1.f); // VEC3F p2_ = ep.A() * VEC3F(p2[0], p2[1], p2[2]); //glVertex3f(p2[0], p2[1], p2[2]); //p = ep.A() * p; glVertex3f(p.x, p.y, p.z); for (int i = 0; i < iter + 1; i++){ float rad = angle * i; glColor3f(i % 2, 0.f, i % 2 + 1.f); VEC3D q(sin(rad)*topRadius, length * 0.5, cos(rad) * topRadius); //q = ep.A() * q; glVertex3f(/*origin[0] + */(float)q.x, /*origin[1] + */(float)q.y, /*origin[2] + */(float)q.z); } } glEnd(); glPopMatrix(); glBegin(GL_TRIANGLE_FAN); { VEC3D p = VEC3D(0.f, -length * 0.5f, 0.f); //float p[3] = { 0.f, -length * 0.5f, 0.f }; glColor3f(0.f, 0.f, 1.f); //glVertex3f(p1[0], p1[1], p1[2]); //p = ep.A() * p; glVertex3f(p.x, p.y, p.z); //glVertex3f(p[0], p[1], p[2]); for (int i = 0; i < iter + 1; i++){ float rad = angle * i; glColor3f(i % 2, 0.0f, i % 2 + 1.0f); VEC3D q(sin(-rad)*baseRadius, -length * 0.5, cos(-rad) * baseRadius); //q = ep.A() * q; glVertex3f(/*origin[0] + */q.x, /*origin[1] + */q.y, /*origin[2] +*/ q.z); } } glEnd(); glBegin(GL_QUAD_STRIP); { for (int i = 0; i < iter + 1; i++){ float rad = angle * i; VEC3D q1(sin(rad) * topRadius, length * 0.5, cos(rad) * topRadius); VEC3D q2(sin(rad) * baseRadius, -length * 0.5, cos(rad) * baseRadius); //q1 = ep.A() * q1; //q2 = ep.A() * q2; glVertex3f(/*origin[0] + */q2.x, /*origin[1] + */q2.y, /*origin[2] + */q2.z); glVertex3f(/*origin[0] + */q1.x, /*origin[1] + */q1.y, /*origin[2] + */q1.z); } } glEnd(); glEndList(); return true; }