我想要创造的是一个能够直接拥抱赛道的火箭。 即)火箭沿直线方向行进,并可根据其局部x轴定向。这样它可以上升/下降坡道而不会撞到地面。
目前我正在使用PhysX opengl和C ++。
这是我现在正在尝试的方法: 射线从导弹前射出(射线向下射出) 2.如果光线投射小于预期的光线投射长度,那么我必须向上定向。 3.如果射线投射比预期射线投射长度多,那么我必须向下定位。
现在我遇到的问题是我的导弹定位在一个任意角度(我给它1度。)虽然我认为这是一个糟糕的方法,因为游戏中的帧数不是那么多正如我想的那样。所以火箭会撞上斜坡。
我的主要问题是:有没有更好的方法来解决这个问题以及如何处理?
NxVec3 frontRayLoc = m_rocketConfig->getValueForKey<NxVec3>("r_frontRayCastLocation");
float threshhold = m_rocketConfig->getValueForKey<float>("r_angleThreshhold");
float predRayCastHeight = m_rocketConfig->getValueForKey<float>("r_predRayCastHeight");
NxVec3 rayGlobalPos_1 = m_actor->getGlobalPosition() + m_actor->getGlobalOrientation() * frontRayLoc;
NxVec3 dir = m_actor->getGlobalOrientation() * NxVec3(0,-1.0,0);
NxReal dist1 = castRay(rayGlobalPos_1, dir);
// Get the percentage difference
float actualFrontHeight = abs(1 - (dist1/predRayCastHeight));
// See if the percentage difference is greater then threshold
// Also check if we are being shot off track
if ((actualFrontHeight > threshhold) && (dist1 != m_rayMaxDist)){
// Dip Down
if (dist1 > predRayCastHeight){
printf("DOWN - Distance 1: %f\n", dist1);
// Get axis of rotation
NxVec3 newAxis = m_actor->getGlobalOrientation() * NxVec3(1.0,0,0.0);
// Rotate based on that axis
m_orientateAngle = -1.0 * m_orientateAngle; // For rotating clockwise
NxQuat newOrientation(m_orientateAngle, newAxis);
NxMat33 orientation(newOrientation);
m_orientation = m_orientation * orientation;
// Orientate the linear velocity to keep speed of rocket and direct away from road
NxVec3 linVel = m_actor->getLinearVelocity();
m_actor->setLinearVelocity(m_orientation * linVel);
}
// Go Up
else if (dist1 < predRayCastHeight){
printf("UP - Distance 1: %f\n", dist1);
// Get axis of rotation
NxVec3 newAxis = m_actor->getGlobalOrientation() * NxVec3(1.0,0,0.0);
// Rotate around axis
NxQuat newOrientation(m_orientateAngle, newAxis);
m_actor->setGlobalOrientationQuat(newOrientation);
NxMat33 orientation(newOrientation);
m_orientation = m_orientation * orientation;
// Orientate the linear velocity to keep speed of rocket and direct away from road
NxVec3 linVel = m_actor->getLinearVelocity();
m_actor->setLinearVelocity(m_orientation*linVel);
}
m_actor->setGlobalOrientation(m_orientation);
}
感谢您的支持:)
答案 0 :(得分:3)
如果光线轨迹可以确定前方某个点的地形高度,为什么不能在火箭的当前水平坐标处确定地形的高度,并将火箭渲染到上方的固定高度是什么?
即,您似乎正在尝试为火箭发明一个制导系统,当听起来您真正需要的是找出绘制它的位置。
实际上,你可能可以通过使火箭与其下方地形的坡度相匹配来获得火箭的方向,这样它就不会一直出现死角。如果跟踪明显的斜坡时,它看起来有点奇怪。
答案 1 :(得分:0)
如何按军队对地形的方式进行操作:
向前看距离并找到飞船与飞船之间的最高地形。将地面上所需的高度添加到此值,您就可以获得火箭的高度。如果它低于这个攀升,如果它高于这个下降。
选择获得所需的火箭行为。它可能很小。
很有可能预先计算高度,因此这简化为简单的数组查找。 (即使你有近乎无限的分辨率地形,你也不需要在高度数据中有完美的粒度。)