PfxBool pfxIntersectRayBox(const PfxRayInput &ray,PfxRayOutput &out,const PfxBox &box,const PfxTransform3 &transform) { // レイをBoxのローカル座標へ変換 PfxTransform3 transformBox = orthoInverse(transform); PfxVector3 rayStartPosition = transformBox.getUpper3x3() * ray.m_startPosition + transformBox.getTranslation(); PfxVector3 rayDirection = transformBox.getUpper3x3() * ray.m_direction; // 交差判定 PfxFloat tmpVariable=0.0f; PfxVector3 tmpNormal(0.0f); if(pfxIntersectRayAABB(rayStartPosition,rayDirection,PfxVector3(0.0f),box.m_half,tmpVariable,tmpNormal)) { if(tmpVariable > 0.0f && tmpVariable < out.m_variable) { out.m_contactFlag = true; out.m_variable = tmpVariable; out.m_contactPoint = ray.m_startPosition + tmpVariable * ray.m_direction; out.m_contactNormal = transform.getUpper3x3() * tmpNormal; out.m_subData.m_type = PfxSubData::NONE; return true; } } return false; }
QVector<const AObject*> Teapot::collideSphere( const AObject * exclude, const float & radius, QVector3D & center, QVector3D * normal ) const { QVector<const AObject*> collides = AObject::collideSphere( exclude, radius, center, normal ); float depth; QVector3D tmpNormal(0,1,0); /* if( Sphere::intersectSphere( position(), boundingSphereRadius(), center, radius, &tmpNormal, &depth ) ) { collides.append( this ); center += tmpNormal * depth; if( normal ) *normal = tmpNormal; } */ if( Capsule::intersectSphere( position(), position()+QVector3D(0,2,0), boundingSphereRadius()/2.0f, center, radius, &tmpNormal, &depth ) ) { collides.append( this ); center += tmpNormal * depth; if( normal ) *normal = tmpNormal; } return collides; }