问题描述
我正在尝试将2005年的某些项目移植到最新的2017年版本中,而现在遇到链接错误。我已经将.lib
文件链接到该项目。
错误提示
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol "struct auMatrix::Matrix<4,4,float> __cdecl auMatrix::operator*<4,float>(struct auMatrix::Matrix<4,float> const &,struct auMatrix::Matrix<4,float> const &)" (??$?D$03$03$03M@auMatrix@@YA?AU?$Matrix@$03$03M@0@ABU10@0@Z) referenced in function "bool __cdecl auIntersect::sphereVsPolygon(struct auVector::Vector3T<float> const &,float,struct auVector::Vector3T<float> const *,int,struct auGeom::TPlane const &,struct auVector::Vector3T<float> *,float *)" (?sphereVsPolygon@auIntersect@@YA_NABU?$Vector3T@M@auVector@@MPBU23@HHABUTPlane@auGeom@@PAU23@3PAM@Z) flRenderServer D:\Projects\FLProject\RenderBox\singlegame_renderbox\Production\FantasticLeague\_Code\FLeague\flRenderServer\auGeom.lib(Intersect.obj) 1
问题是我找不到它所提到的函数中正在描述的运算符。我将在这里粘贴冗长的代码
bool auIntersect::sphereVsPolygon(Vector3 const ¢ro,float radio,Vector3 const *v,const int nVertices,int stride,TPlane const &p,Vector3 *pos /* = NULL */,Vector3 *normal /* = NULL */,float *overlap /* = NULL */)
{
ASSERT(nVertices>=3);
//---------------------------------------------------------------------
// Comprobamos si el primer vertice pertenece a la esfera,esto ES NECESARIO para que la
// rutina no falle con esferas que contengan totalmente al polígono
Vector3 punto = centro - *v;
float rad_cuad = radio * radio;
float p_mod_cuad = punto.lengthSqr();
if(p_mod_cuad <= rad_cuad)
{
// El primer vértice del polígono pertenece a la esfera
if(pos && normal && overlap)
{
// Esto es muy aproximado !!!!!!!!!!!!!!!!!!!!!!!
*pos = *v;
*overlap = (float)sqrt(rad_cuad) - (float)sqrt(p_mod_cuad);
//TPlano normalPlane;
//normalPlane.Create(*(v),*(v + stride*1),*(v + stride*2));
//*normal = (Vector3)(normalPlane);
*normal = p.getNormal();
}
return true;
}
//---------------------------------------------------------------------
// Calculamos el plano que contiene al poligono
TPlane plano;
//plano.Create(*(v),*(v + stride*2));
plano = p;
//---------------------------------------------------------------------
// Calculamos la distancia desde el centro de la esfera hasta el plano
float dist = plano.dist(centro);
float fabs_dist = (float)fabs(dist);
if(fabs_dist < radio)
{
//---------------------------------------------------------------------
// La esfera toca el plano del polígono,comprobamos si toca el polígono
// Calculamos la proyección del centro de la esfera sobre el plano
float labda = plano.w - plano.getNormal() * centro;
Vector3 proy_cent = centro + plano.getNormal() * labda;
ASSERT(fabs(plano.dist(proy_cent)) < 0.001f);
// Comprobamos si la proyección del centro de la esfera sobre el plano
// pertenece al polígono,para ello proyectamos todo sobre el plano de
// coordenadas que mas perpendicular sea a la normal del plano
float fabs_planox = (float)fabs(plano.x);
float fabs_planoy = (float)fabs(plano.y);
float fabs_planoz = (float)fabs(plano.z);
float p_x,p_y;
int ind_x,ind_y;
if(fabs_planox > fabs_planoy)
{
if(fabs_planox > fabs_planoz)
{
// Proyectamos sobre el plano YZ
ind_x = 1;
ind_y = 2;
}
else
{
// Proyectamos sobre el plano XY
ind_x = 0;
ind_y = 1;
}
}
else
{
if(fabs_planoz > fabs_planoy)
{
// Proyectamos sobre el plano XY
ind_x = 0;
ind_y = 1;
}
else
{
// Proyectamos sobre el plano XZ
ind_x = 0;
ind_y = 2;
}
}
p_x = proy_cent[ind_x];
p_y = proy_cent[ind_y];
// Comprobamos si el centro está al lado correcto de todas las aristas
int j = nVertices - 1;
bool dentro = true;
float signo;
for(int i=0; i<nVertices; j=i,i++)
{
// Calculamos la recta en la forma: N*p - D = 0
float NX = (*(v + stride*i)).operator[](ind_y) - (*(v + stride*j)).operator[](ind_y);
float NY = - (*(v + stride*i)).operator[](ind_x) - (*(v + stride*j)).operator[](ind_x);
float D = NX*(*(v + stride*i)).operator[](ind_x) + NY*(*(v + stride*i)).operator[](ind_y);
// Metemos el punto en la ecuación
float s = (NX*p_x + NY*p_y - D)>0 ? 1.0f : -1.0f;
if(!i)
// Primer signo
signo = s;
else
// Comprobamos que el nuevo signo sea = que los anteriores
if(s!=signo)
{
dentro = false;
break;
}
}
if(dentro)
{
// Efectivamente,la proyección del centro de la esfera pertenece al polígono
if(pos && normal && overlap)
{
// Esto es muy aprox !!!!!!!!!!!!!!!!!!!!!!!
*overlap = radio - fabs_dist;
*pos = proy_cent;
//TPlano normalPlane;
//normalPlane.Create(*(v),*(v + stride*2));
//*normal = (Vector3)(normalPlane);
*normal = p.getNormal();
}
return true;
}
// Comprobamos si la esfera colisiona con el segmento de cada lado
j = nVertices - 1;
for(int i = 0;i < nVertices; j=i,i++)
{
// Calculamos las intersecciones de la esfera con la recta que contiene al polígono
Vector3 vrecta = Vector3((*(v + stride*i)).x - (*(v + stride*j)).x,(*(v + stride*i)).y
- (*(v + stride*j)).y,(*(v + stride*i)).z - (*(v + stride*j)).z);
float vrecta_cuad = vrecta * vrecta;
if(vrecta_cuad > 1.0e-6)
{
// Desplazamos la esfera para que la recta pase por el origen
Vector3 n_centro = centro - * (v + stride*j);
float vrecta_por_centro = vrecta * n_centro;
float discri = vrecta_por_centro * vrecta_por_centro - vrecta_cuad*(n_centro*n_centro-rad_cuad);
if(discri > 0)
{
discri = (float)sqrt(discri);
float denom = vrecta_cuad;
float labda1 = (vrecta_por_centro + discri) / denom;
float labda2 = (vrecta_por_centro - discri) / denom;
if(inRange(labda1,0.0f,1.0f) || inRange(labda2,1.0f))
{
// La esfera colisiona con este lado
if(pos && normal && overlap)
{
// Esto es muy aprox !!!!!!!!!!!!!!!!!!!!!!!
float labda = (labda1 + labda2) * 0.5f;
*pos = *(v + stride*j) + vrecta * labda;
Vector3 centro_inter = *pos - centro;
*overlap = radio - centro_inter.length();
//TPlano normalPlane;
//normalPlane.Create(*(v),*(v + stride*2));
//*normal = (Vector3)(normalPlane);
*normal = p.getNormal();
}
return true;
}
}
}
}
}
return false;
}
我检查了是否包含文件。 Matrix4 *
位于Matrix.h内部,而Intersect.h确实包含Matrix.h。
任何帮助将不胜感激:)
谢谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)