本文整理汇总了C++中Hit::time方法的典型用法代码示例。如果您正苦于以下问题:C++ Hit::time方法的具体用法?C++ Hit::time怎么用?C++ Hit::time使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Hit
的用法示例。
在下文中一共展示了Hit::time方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: quantityIntersected
float Plane::quantityIntersected(const qglviewer::Vec& _depart, const qglviewer::Vec& _arrivee,float _light_radius) const{
Hit hit;
Ray ray(_depart,(_arrivee-_depart).unit());
float taille_segment = (_arrivee-_depart).norm();
bool intersected;
((Plane*)this)->width_ += 2*_light_radius;
((Plane*)this)->height_ += 2*_light_radius;
intersected = intersect(ray, hit);
((Plane*)this)->width_ -= 2*_light_radius;
((Plane*)this)->height_ -= 2*_light_radius;
if ( not intersected ){
return 0;
}
if ( taille_segment < hit.time() ){
return 0;
}
qglviewer::Vec intersection_plan = frame().coordinatesOf(ray.start()+(hit.time()*ray.direction()));
assert(intersection_plan.z < 0.01);
float depassement_u;
float depassement_v;
if ( width_ > 0 ){
depassement_u = ABS(intersection_plan.x)-width_/2.0;
}else{
depassement_u = -1; // on dépasse pas
}
if ( height_ > 0 ){
depassement_v = ABS(intersection_plan.y)-height_/2.0;
}else{
depassement_v = -1; // on dépasse pas
}
depassement_u = depassement_u/_light_radius;
depassement_v = depassement_v/_light_radius;
if ( depassement_u < 0 && depassement_v < 0 ){return 1.0;}
if ( depassement_u > 0 && depassement_v < 0 ){return 1.0-depassement_u;}
if ( depassement_u < 0 && depassement_v > 0 ){return 1.0-depassement_v;}
if ( depassement_u > 0 && depassement_v > 0 ){return MAX(1.0-depassement_v-depassement_u,0);}
return 1.0;
}
示例2: displayIntersectionDebug
void Cylindre::displayIntersectionDebug(const Ray& ray,
Hit& hit,
const qglviewer::Vec& O,
const qglviewer::Vec& I,
float t) const{
std::cout << "\nINTERSECTION du cylindre :" << std::endl;
std::cout << *this << std::endl;
std::cout << "Avec le rayon :" << std::endl;
std::cout << ray << std::endl;
std::cout << "TEMPS : " << hit.time() << std::endl;
std::cout << "Point d'intersection : " << hit.intersection() << std::endl;
std::cout << "O : " << O << std::endl;
std::cout << "I : " << I << std::endl;
std::cout << "t : " << t << std::endl;
}
示例3: intersect
//.........这里部分代码省略.........
//cout << "PAS D'INTERSECTION avec la robe du cylindre" << endl;
#endif
bool top = topdisque()->intersect(ray,hit);
bool bottom = bottomdisque()->intersect(ray,hit);
return top || bottom;
}
// on calcule la normale en ce point, dans les coordonnées du cylindre toujours
float theta = 0;
Vec normale;
normale.x = I.x;
normale.y = I.y;
normale.z = 0;
if (normale.norm() == 0)
{
cout << "la norme de la normale est nulle" << endl;
}
if (R1>=R2){
theta = atan((R1-R2)/h);
normale = normale * (1/normale.norm())*cos(theta);
normale = normale + Vec(0,0,sin(theta));
}
else
{
theta = atan(h/(R2-R1));
normale = normale * (1/normale.norm())*sin(theta);
normale = normale - Vec(0,0,cos(theta));
}
if ( hit.time() > t){
hit.setTime(t);
Vec locale = frame().inverseTransformOf(I);
hit.setIntersection(locale);
hit.setNormal(frame().inverseTransformOf(normale));
hit.setMaterial(material());
computeUV(hit);
#ifdef DEBUG_INTERSEC
displayIntersectionDebug(ray,hit,O,I,t);
#endif
topdisque()->intersect(ray,hit);
bottomdisque()->intersect(ray,hit);
return true;
}else{
return false;
}
}
if (delta ==0)
{
#ifdef DEBUG_INTERSEC
cout << "delta est nul, il y a une solution" << endl;
#endif
// une solution, regarder si on intersecte les disques et comparer les time obtenu pour trouver le plus petit
float t;
if (a==0)
{
t = -c/b;
}
else
{
t=(-b/(2*a));
示例4: intersect
bool Plane::intersect(const Ray& ray, Hit& hit) const
{
#ifdef DEBUG_INTERSEC
std::cout << "TENTATIVE d'intersection du rayon :\n" << ray << "avec le plan\n" << *this << std::endl;
#endif
// on place le ray dans le répère associé au plan
Ray ray_associe_plan(frame().coordinatesOf(ray.start()),
frame().transformOf(ray.direction()));
#ifdef DEBUG_INTERSEC
std::cout << "rayon dans l'espace du plan : \n" << ray_associe_plan << std::endl;
#endif
// on vérifie que le ray pointe vers le plan
if ( ( ray_associe_plan.start().z <= 0 && ray_associe_plan.direction().z <= 0 )
||
( ray_associe_plan.start().z >= 0 && ray_associe_plan.direction().z >= 0 )
)
{
#ifdef DEBUG_INTERSEC
std::cout << "PAS D'INTERSECTION" << std::endl;
#endif
return false;
}
// on détermine le t de l'intersection dans la formule
// zstart + t*zdir = 0
float t = -ray_associe_plan.start().z/ray_associe_plan.direction().z;
if ( hit.time() < t ){
#ifdef DEBUG_INTERSEC
std::cout << "PAS D'INTERSECTION : " << t << " > " << hit.time() << std::endl;
#endif
return false;
}
#ifdef DEBUG_INTERSEC
std::cout << "Intersection au temps : " << t << std::endl;
#endif
// Calcul des coordonnées de l'intersection dans le plan et
// rejet si on dépasse
float u,v;
u = ray_associe_plan.start().x+t*ray_associe_plan.direction().x;
if ( width_ > 0 && (u > width_/2.0 || u < -width_/2.0) ){
#ifdef DEBUG_INTERSEC
std::cout << "PAS D'INTERSECTION : u = " << u << ", width = " << width_ << std::endl;
#endif
return false;
}
v = ray_associe_plan.start().y+t*ray_associe_plan.direction().y;
if ( height_ > 0 && (v > height_/2.0 || v < -height_/2.0) ){
#ifdef DEBUG_INTERSEC
std::cout << "PAS D'INTERSECTION : v = " << v << ", height = " << height_ << std::endl;
#endif
return false;
}
qglviewer::Vec inter_plan = qglviewer::Vec(u,v,0);
#ifdef DEBUG_INTERSEC
std::cout << "INTERSECTION d'un rayon avec le plan \n"<< *this << "\tau temps : " << t << std::endl;
#endif
hit.setTime(t);
hit.setIntersection(frame().inverseCoordinatesOf(inter_plan));
if ( ray_associe_plan.start().z <= 0 ){
hit.setNormal(frame().inverseTransformOf(qglviewer::Vec(0,0,-1)));
}else{
hit.setNormal(frame().inverseTransformOf(qglviewer::Vec(0,0,1)));
}
hit.setMaterial(material());
// On envoie les coordonnées de la texture (entre 0 et 1 si la
// partie est finie)
if ( width_ > 0 ){
u = u/width_ + 0.5;
}
if ( height_ > 0 ){
v = v/height_ + 0.5;
}
#ifdef DEBUG_INTERSEC
std::cout << "Coordonnées de textures ("<< u << "," << v << ")" << std::endl;
#endif
hit.setCoord(u,v);
return true;
#ifdef DEBUG
cerr << "Erreur lors du calcul de l'intersection d'un objet avec un rayon" << endl;
#endif
return false;
}