Как далеко нужно переместить точку, чтобы вывести ее за пределы поля зрения? ⇐ C++
-
Anonymous
Как далеко нужно переместить точку, чтобы вывести ее за пределы поля зрения?
Я создаю усеченное представление из комбинированной матрицы (функция в конце вопроса для справки).
Что я хочу сделать, так это иметь объект в точке xyz... и вектор направления abc, оба в мировом пространстве. Я хочу знать, как далеко нужно переместить xyz вдоль abc, чтобы он оказался за пределами усеченной пирамиды вида, т. е. столкнулся с одной из плоскостей усеченной пирамиды вида.
Сейчас я делаю это, просто перемещая объект на определенный интервал и проверяя, находится ли он все еще в усеченной пирамиде. Это кажется неуклюжим и медленным.
Как я могу преобразовать усеченное представление в мировое пространство или, альтернативно, преобразовать xyz/abc в пространство отсечения, выполнить столкновение плоскостей и снова преобразовать его обратно?
Вот функция, с помощью которой я создаю усеченную пирамиду:
void ViewFrustum::FromMatrix(Matrix& theMatrix, float theMult) { Плоскость* АП; Вектор аЦентр; aP=&mPlane[FRUSTRUM_RIGHT]; aP->mPos.mX=theMatrix.mData.mm[3]-theMatrix.mData.mm[0]; aP->mPos.mY=theMatrix.mData.mm[7]-theMatrix.mData.mm[4]; aP->mPos.mZ=theMatrix.mData.mm[11]-theMatrix.mData.mm[8]; aP->mD=theMatrix.mData.mm[15]-theMatrix.mData.mm[12]; aCenter+=aP->mPos; aP=&mPlane[FRUSTRUM_LEFT]; aP->mPos.mX=theMatrix.mData.mm[3]+theMatrix.mData.mm[0]; aP->mPos.mY=theMatrix.mData.mm[7]+theMatrix.mData.mm[4]; aP->mPos.mZ=theMatrix.mData.mm[11]+theMatrix.mData.mm[8]; aP->mD=theMatrix.mData.mm[15]+theMatrix.mData.mm[12]; aCenter+=aP->mPos; aP=&mPlane[FRUSTRUM_BOTTOM]; aP->mPos.mX=theMatrix.mData.mm[3]+theMatrix.mData.mm[1]; aP->mPos.mY=theMatrix.mData.mm[7]+theMatrix.mData.mm[5]; aP->mPos.mZ=theMatrix.mData.mm[11]+theMatrix.mData.mm[9]; aP->mD=theMatrix.mData.mm[15]+theMatrix.mData.mm[13]; aCenter+=aP->mPos; aP=&mPlane[FRUSTRUM_TOP]; aP->mPos.mX=theMatrix.mData.mm[3]-theMatrix.mData.mm[1]; aP->mPos.mY=theMatrix.mData.mm[7]-theMatrix.mData.mm[5]; aP->mPos.mZ=theMatrix.mData.mm[11]-theMatrix.mData.mm[9]; aP->mD=theMatrix.mData.mm[15]-theMatrix.mData.mm[13]; aCenter+=aP->mPos; aP=&mPlane[FRUSTRUM_FAR]; aP->mPos.mX=theMatrix.mData.mm[3]-theMatrix.mData.mm[2]; aP->mPos.mY=theMatrix.mData.mm[7]-theMatrix.mData.mm[6]; aP->mPos.mZ=theMatrix.mData.mm[11]-theMatrix.mData.mm[10]; aP->mD=theMatrix.mData.mm[15]-theMatrix.mData.mm[14]; aCenter+=aP->mPos; aP=&mPlane[FRUSTRUM_NEAR]; aP->mPos.mX=theMatrix.mData.mm[3]+theMatrix.mData.mm[2]; aP->mPos.mY=theMatrix.mData.mm[7]+theMatrix.mData.mm[6]; aP->mPos.mZ=theMatrix.mData.mm[11]+theMatrix.mData.mm[10]; aP->mD=theMatrix.mData.mm[15]+theMatrix.mData.mm[14]; aCenter+=aP->mPos; аЦентр/=6; for (int aCount=0;aCount
Я создаю усеченное представление из комбинированной матрицы (функция в конце вопроса для справки).
Что я хочу сделать, так это иметь объект в точке xyz... и вектор направления abc, оба в мировом пространстве. Я хочу знать, как далеко нужно переместить xyz вдоль abc, чтобы он оказался за пределами усеченной пирамиды вида, т. е. столкнулся с одной из плоскостей усеченной пирамиды вида.
Сейчас я делаю это, просто перемещая объект на определенный интервал и проверяя, находится ли он все еще в усеченной пирамиде. Это кажется неуклюжим и медленным.
Как я могу преобразовать усеченное представление в мировое пространство или, альтернативно, преобразовать xyz/abc в пространство отсечения, выполнить столкновение плоскостей и снова преобразовать его обратно?
Вот функция, с помощью которой я создаю усеченную пирамиду:
void ViewFrustum::FromMatrix(Matrix& theMatrix, float theMult) { Плоскость* АП; Вектор аЦентр; aP=&mPlane[FRUSTRUM_RIGHT]; aP->mPos.mX=theMatrix.mData.mm[3]-theMatrix.mData.mm[0]; aP->mPos.mY=theMatrix.mData.mm[7]-theMatrix.mData.mm[4]; aP->mPos.mZ=theMatrix.mData.mm[11]-theMatrix.mData.mm[8]; aP->mD=theMatrix.mData.mm[15]-theMatrix.mData.mm[12]; aCenter+=aP->mPos; aP=&mPlane[FRUSTRUM_LEFT]; aP->mPos.mX=theMatrix.mData.mm[3]+theMatrix.mData.mm[0]; aP->mPos.mY=theMatrix.mData.mm[7]+theMatrix.mData.mm[4]; aP->mPos.mZ=theMatrix.mData.mm[11]+theMatrix.mData.mm[8]; aP->mD=theMatrix.mData.mm[15]+theMatrix.mData.mm[12]; aCenter+=aP->mPos; aP=&mPlane[FRUSTRUM_BOTTOM]; aP->mPos.mX=theMatrix.mData.mm[3]+theMatrix.mData.mm[1]; aP->mPos.mY=theMatrix.mData.mm[7]+theMatrix.mData.mm[5]; aP->mPos.mZ=theMatrix.mData.mm[11]+theMatrix.mData.mm[9]; aP->mD=theMatrix.mData.mm[15]+theMatrix.mData.mm[13]; aCenter+=aP->mPos; aP=&mPlane[FRUSTRUM_TOP]; aP->mPos.mX=theMatrix.mData.mm[3]-theMatrix.mData.mm[1]; aP->mPos.mY=theMatrix.mData.mm[7]-theMatrix.mData.mm[5]; aP->mPos.mZ=theMatrix.mData.mm[11]-theMatrix.mData.mm[9]; aP->mD=theMatrix.mData.mm[15]-theMatrix.mData.mm[13]; aCenter+=aP->mPos; aP=&mPlane[FRUSTRUM_FAR]; aP->mPos.mX=theMatrix.mData.mm[3]-theMatrix.mData.mm[2]; aP->mPos.mY=theMatrix.mData.mm[7]-theMatrix.mData.mm[6]; aP->mPos.mZ=theMatrix.mData.mm[11]-theMatrix.mData.mm[10]; aP->mD=theMatrix.mData.mm[15]-theMatrix.mData.mm[14]; aCenter+=aP->mPos; aP=&mPlane[FRUSTRUM_NEAR]; aP->mPos.mX=theMatrix.mData.mm[3]+theMatrix.mData.mm[2]; aP->mPos.mY=theMatrix.mData.mm[7]+theMatrix.mData.mm[6]; aP->mPos.mZ=theMatrix.mData.mm[11]+theMatrix.mData.mm[10]; aP->mD=theMatrix.mData.mm[15]+theMatrix.mData.mm[14]; aCenter+=aP->mPos; аЦентр/=6; for (int aCount=0;aCount
Мобильная версия