📄 walking.cpp
字号:
//-----------------------------------------------------------------------------------------------------------
// File : Walking.cpp
//-----------------------------------------------------------------------------------------------------------
#include "StdAfx.h"
CWalking::CWalking(D3DXVECTOR3 *pPos, D3DXVECTOR3 *pvDir, float *Speed)
{
m_type = Walking;
m_pvPos = pPos;
m_pvDir = pvDir;
m_pSpeed = Speed;
m_dwLastTime = timeGetTime();
m_dwCurTime = 0;
m_dwAccTime = 0;
m_dwMoveTime = 500;
m_bHorizontal = false;
m_fResistance = 0;
m_vOffset = D3DXVECTOR3(0,0,0);
}
CWalking::~CWalking()
{
}
BOOL CWalking::MoveUp(PICKING *pRay)
{
/* // 臭捞啊 乐栏搁 棵扼啊扁.
// 伙阿屈捞 绝促搁 酒贰肺 冻备扁.
if( pRay[RAY_DOWN].Dist < 10000.0f)
{
D3DXVECTOR3 vPos = m_pLower->GetPosVector();
if( fabs(vPos.y-pRay[RAY_DOWN].vIntersectPt.y) > 2.0f ) // 2 捞惑 瞒捞唱搁 冻绢廉具窃
return FALSE;
else
{ vPos.y = pRay[RAY_DOWN].vIntersectPt.y; }
m_pLower->Translation(&vPos,TRUE);
return TRUE;
}*/
return FALSE;
}
float CWalking::MoveUp(INTERSECT *pInter)
{
D3DXVECTOR3 vN = m_pSphere->vCenter-pInter->vInterPt;
float Angle = CUtility::SectorV1ToV2(&D3DXVECTOR3(0,1,0),&vN);
CUtility::printf_Debug("\nAngle:%f",Angle);
CUtility::printf_Debug("\nvN:%f, %f, %f",vN.x,vN.y,vN.z);
CUtility::printf_Debug("\nInter:%f, %f, %f",pInter->vInterPt.x,pInter->vInterPt.y,pInter->vInterPt.z);
/* CUtility::printf_Debug("\nvPos:%f, %f, %f\n",vObjectPos.x,vObjectPos.y,vObjectPos.z);*/
if( Angle < D3DX_PI/4 ) // 180/3 = 60档 -> 扼叼救 窜困捞骨肺 3.141592/3 = 1.04719...
{
return pInter->vInterPt.y;
}
return 0;
/*D3DXVECTOR3 vN = pInter->vInterPt-m_pSphere->vCenter;
float Angle = CUtility::SectorV1ToV2(&vN,&(-pInter->vN));
if( Angle < D3DX_PI/2 )
{
return pInter->vInterPt.y;
} D3DXVECTOR3 vN = m_pSphere->vCenter-pInter->vInterPt;
vN += m_pSphere->vCenter-m_pLower->GetPosVector();
vN/=2;
/*D3DXVECTOR3 vN = m_pSphere->vCenter - pInter->vInterPt;
float Angle = CUtility::SectorV1ToV2(&vN,&(-pInter->vN));
if( Angle < D3DX_PI/4 ) // 棵扼啊扁
{
return pInter->vInterPt.y;
}
else // 固掺矾瘤扁
{
}*/
/*
float UpAngle = CUtility::SectorV1ToV2(&D3DXVECTOR3(0,1,0),&(-pInter->vN)); // vN阑 开栏肺 父甸绢辑 结具窃.
if( UpAngle < D3DX_PI/3 ) // 180/3 = 60档 -> 扼叼救 窜困捞骨肺 3.141592/3 = 1.04719...
{
return pInter->vInterPt.y;
}
/*D3DXVECTOR3 vDir;
D3DXVec3Normalize(&vDir,m_pvDir);
float UpAngle = CUtility::SectorV1ToV2(&vDir,&(-pInter->vN)); // vN阑 开栏肺 父甸绢辑 结具窃.
float pi4 = D3DX_PI/4;
if( UpAngle > D3DX_PI/2 && UpAngle < D3DX_PI-pi4 ) // 180/3 = 60档 -> 扼叼救 窜困捞骨肺 3.141592/3 = 1.04719...
{
return pInter->vInterPt.y;
}*/
}
bool CWalking::MoveCollision(CCollision *pCol, float *pHeight)
{
//-------------------------------------------------------//
// + 抗惑登绰 滚弊(惯斑等 滚弊)
// 1. 版荤搁阑 坷福搁辑 寒俊 何调煤阑锭-> 浇扼捞爹 加档啊 弧扼咙.
// ..棵扼啊绰 加档 + 寒 浇扼捞爹加档 = 弥辆加档啊 登绰淀窃.
// 2. pi/4 阿档 焊促 歹 累阑锭 烹烹 脾绰 滚弊 -> 捞 沥档绰 公矫秦拎档..
// ..唱吝俊 粱 歹 沥剐茄 面倒规过栏肺 秦搬秦焊磊.
//-------------------------------------------------------
// + 面倒 八荤俊 措茄 措救 舅绊府硫
// 1. 矫埃捞 甸绢埃 八荤 / 矫埃俊 蝶弗 沥犬茄 背痢阑 茫绰促.
// 2. 飘府甫 捞侩茄 规过 / 弃府帮阑 老沥茄 扁霖栏肺 OBBTree甫 父电促.
// Ζ> 畴钢蔼苞, 局概茄 扁霖捞 巩力
//--------------------------------------------------------//
bool bDown = false;
// 备甫 积己窍绊 面倒阑 八荤
DWORD dwSize = CMovement::Collision(pCol);
if( dwSize )
{
// 吝缴痢俊辑 啊厘 啊鳖款 背痢阑 茫绰促.
INTERSECT tagMin = m_pInter[0]; // 窍窜阑 力寇茄 啊厘 累篮 巴捞 历厘凳~
INTERSECT tagDownMin = m_pInter[0]; // 窍窜俊辑 积扁绰 背痢 吝俊 啊厘 累篮巴
for(int i=0; i<dwSize; ++i)
{
float Len = D3DXVec3Length(&(m_pInter[i].vInterPt-m_pSphere->vCenter));
D3DXVECTOR3 vN = m_pSphere->vCenter-m_pInter[i].vInterPt;
float Angle = CUtility::SectorV1ToV2(&D3DXVECTOR3(0,1,0),&vN);
if( Angle < D3DX_PI/4 )
{
if( D3DXVec3Length(&(tagDownMin.vInterPt-m_pSphere->vCenter)) >= Len )
{
bDown=true;
tagDownMin = m_pInter[i];
}
}
// 啊鳖款 背痢阑 茫绰促.
else if( D3DXVec3Length(&(tagMin.vInterPt-m_pSphere->vCenter)) > Len )
{
tagMin = m_pInter[i];
}
}//end for
D3DXVECTOR3 vDir;
D3DXVec3Normalize(&vDir,m_pvDir);
if( !this->MoveHor(vDir,m_pSphere->vCenter,tagMin.vInterPt)) // 荐乞
{
this->MoveHor(D3DXVECTOR3(0,-1,0),m_pSphere->vCenter,tagMin.vInterPt);
}
if(bDown)
{
(*pHeight) = tagDownMin.vInterPt.y; //this->MoveUp(&tagDownMin); // 棵扼啊扁
}
}//end if
return bDown;
}
bool CWalking::MoveHor(D3DXVECTOR3 &vDir, D3DXVECTOR3 &vCenter, D3DXVECTOR3 &vInterPt)
{
// 乞搁阑 父电促~
D3DXPLANE plane;
D3DXPlaneFromPointNormal(&plane,&vCenter,&vDir); // 吝缴痢俊辑 框流咯具且 规氢阑 啊瘤绰 乞搁阑 父惦
if( D3DXPlaneDotCoord(&plane,&vInterPt) > 0 ) // 背痢捞 捞 乞搁俊 菊率俊 乐促搁, 荐乞框流烙阑 茄促.
{
D3DXVECTOR3 vN;
D3DXVec3Normalize(&vN,&(vCenter-vInterPt)); // 啊厘 累篮 背痢俊辑 吝缴痢栏肺 啊绰 归磐甫 畴钢蔼栏肺 敬促.
float Dist = fabs( (*m_pSpeed) - m_fResistance );
(*m_pvDir) = CUtility::Hypotenuse(vN,(*m_pvDir),Dist);
m_bHorizontal = true;
// CUtility::printf_Debug("\nm_pvDir : %f, %f, %f",m_pvDir->x,m_pvDir->y,m_pvDir->z);
}
return m_bHorizontal;
}
bool CWalking::MoveHor(CCollision *pCol, float *pHeight)
{
/* D3DXVECTOR3 vDir;
D3DXVec3Normalize(&vDir,m_pvDir);
m_bHorizontal = false;
D3DXVECTOR3 vCenter;
float fR;
m_pLower->GetBoxCenter(&vCenter,&fR);
// 备啊 局聪概捞记俊 规秦 罐瘤 臼扁 困秦辑
fR = 0.5f;
vCenter.x = m_pLower->GetPosVector().x;
vCenter.z = m_pLower->GetPosVector().z;
INTERSECT *pIn=NULL;
DWORD dwSize = pCol->TriangleToSphere(vCenter,fR,&pIn);
if( dwSize )
{
// 吝缴痢俊辑 啊厘 啊鳖款 背痢阑 茫绰促.
INTERSECT Temp=pIn[0]; // Temp俊 啊厘 累篮 巴捞 历厘凳~
for(int i=0; i<dwSize; ++i)
{
if( D3DXVec3Length(&(Temp.vInterPt-vCenter)) > D3DXVec3Length(&(pIn[i].vInterPt-vCenter))) // 酒聪扼搁 俩 啊鳖款 背痢阑 茫绰促.
{
Temp = pIn[i];
}
}//end for
/* D3DXPLANE p;
D3DXPlaneFromPointNormal(&p,&vCenter,&D3DXVECTOR3(0,-1,0)); // 吝缴痢俊辑 框流咯具且 规氢阑 啊瘤绰 乞搁阑 父惦
if( D3DXPlaneDotCoord(&p,&Temp.vInterPt) > 0 )
{
(*pHeight) = Temp.vInterPt.y;
}
// D3DXVECTOR3 vDir2 = (Temp.vInterPt-vCenter); // 季磐俊辑 背痢栏肺 氢窍绰 规氢阑 父惦
// D3DXVECTOR3 vCross;
// D3DXVec3Cross(&vCross,&D3DXVECTOR3(0,1,0),&vDir2);
// float Angle = CUtility::SectorV1ToV2(&vCross,&vDir2); // 阿档甫 备茄促.
// float pi4 = D3DX_PI/4; // pi甫 4俺肺 律暗促.
// if( Angle > pi4 && Angle < D3DX_PI - pi4 ) // 备茄 阿档啊 裹困 救俊 乐促搁
// {
// (*pHeight) = Temp.vInterPt.y;
// }
float UpAngle = CUtility::SectorV1ToV2(&D3DXVECTOR3(0,1,0),&(-Temp.vN)); // vN阑 开栏肺 父甸绢辑 结具窃.
if( UpAngle < D3DX_PI/3 ) // 180/3 = 60档 -> 扼叼救 窜困捞骨肺 3.141592/3 = 1.04719...
{
(*pHeight) = Temp.vInterPt.y;
}
// 乞搁阑 父电促~
D3DXPLANE plane;
D3DXPlaneFromPointNormal(&plane,&vCenter,&vDir); // 吝缴痢俊辑 框流咯具且 规氢阑 啊瘤绰 乞搁阑 父惦
if( D3DXPlaneDotCoord(&plane,&Temp.vInterPt) > 0 ) // 背痢捞 捞 乞搁俊 菊率俊 乐促搁, 荐乞框流烙阑 茄促.
{
D3DXVECTOR3 vN;
D3DXVec3Normalize(&vN,&(vCenter-Temp.vInterPt)); // 啊厘 累篮 背痢俊辑 吝缴痢栏肺 啊绰 归磐甫 畴钢蔼栏肺 敬促.
// 加档 拌魂 = V = 规氢氦磐 * |捞悼樊| : 捞悼樊俊 -啊 甸绢哎 版快 馆措肺 框流捞霸 凳..
D3DXVECTOR3 V;
D3DXVec3Normalize(&V,m_pvDir);
float Dist = (*m_pSpeed) - m_fResistance;
V *= fabs(Dist);
// 荐乞急盒 拌魂 = V - (V
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -