Cc3dVector4 componentProduct(const Cc3dVector4&v1,const Cc3dVector4&v2){ Cc3dVector4 v(v1.x()*v2.x(), v1.y()*v2.y(), v1.z()*v2.z(), v1.w()*v2.w()); return v; }
Cc3dVector4 cross(const Cc3dVector4&v1,const Cc3dVector4&v2) { assert(v1.w()==0); assert(v2.w()==0); Cc3dVector4 rs(v1.y()*v2.z()-v1.z()*v2.y(), v1.z()*v2.x()-v1.x()*v2.z(), v1.x()*v2.y()-v1.y()*v2.x(), 0);//cross product result must be a vector, so the fourth component set to zero return rs; }
Cc3dVector4 normalize(const Cc3dVector4&v){ //assert(v.w()==0); float r2=v.x()*v.x()+v.y()*v.y()+v.z()*v.z(); if(r2==0){ return Cc3dVector4(0,0,0,0); } float r=sqrtf(r2); Cc3dVector4 rs(v.x()/r,v.y()/r,v.z()/r,0); return rs; }
void Coctree::getpCollisionLeafList_inn(CocNode*pNode,const Cc3dVector4&c,float R, vector<CocNode*>&pCollisionLeafList) //获得与c为球心R为半径球体的碰撞叶子节点 { if(pNode==NULL)return; //检查球体cR是否与pNode碰撞 bool collision=false; { const float *c_node=pNode->getCenter().getArray(); const float R_node=pNode->getBoundingSphereRadius(); float d2=square(c_node[0]-c.x())+square(c_node[1]-c.y())+square(c_node[2]-c.z()); if(d2<square(R+R_node)){//相交 collision=true; } }//得到collision if(collision){//如果碰撞 if(pNode->getIsLeaf()){ //将pNode加入到pCollisionLeafList pCollisionLeafList.push_back(pNode); }else{ //去考察pNode的孩子 for(int i=0;i<8;i++){ getpCollisionLeafList_inn(pNode->getChildByIndex(i),c,R,pCollisionLeafList); } } } }
float dot(const Cc3dVector4&v1,const Cc3dVector4&v2){ return v1.x()*v2.x()+v1.y()*v2.y()+v1.z()*v2.z(); }
float getLength(const Cc3dVector4&v){ assert(v.w()==0); return sqrtf(v.x()*v.x()+v.y()*v.y()+v.z()*v.z()); }
float getLength2(const Cc3dVector4&v){//square of length assert(v.w()==0); return v.x()*v.x()+v.y()*v.y()+v.z()*v.z(); }
void Cc3dTransform::setPos(const Cc3dVector4&pos){ setPos(pos.x(),pos.y(),pos.z()); }
Cc3dVector4 Cc3dVector4::operator -(const Cc3dVector4&right)const { Cc3dVector4 rs(this->x()-right.x(),this->y()-right.y(),this->z()-right.z(),this->w()-right.w()); return rs; }