Помогите с этим вопросом - PullRequest
       9

Помогите с этим вопросом

0 голосов
/ 08 сентября 2010

Вот моя проблема. Я рендеринг оси выравнивания кубов, которые все одинакового размера. Я создал алгоритм, который рендерится вокруг игрока так:

******
******
***p**
******
******

Пока это работает, игрок не видит весь этот радиус. Я знаю угол поворота игрока по оси Y, поэтому я надеялся изменить свой алгоритм на основе этого, чтобы он только отображал то, что игрок может видеть более или менее.

SetPlayerPosition();
float yrotrad;
yrotrad = (Camera.roty / 180 * 3.141592654f);




PlayerPosition.x += 70 * float(sin(yrotrad));
PlayerPosition.y -= 20;
PlayerPosition.z += 70 * -(float(cos(yrotrad)));

collids.clear();
for(int i = 0; i < 135; ++i)
{
 for(int j = 0; j < 50; ++j)
 {
  for(int k = 0; k < 135; ++k)
  {
   if(!CubeIsEmpty(PlayerPosition.x + i, PlayerPosition.y + j, PlayerPosition.z + k))
   {
    collids.push_back(GetCube(PlayerPosition.x + i, PlayerPosition.y + j, PlayerPosition.z + k));
   }
  }
 }
}

По сути, мой первоначальный алгоритм просто вычел бы 70 из местоположения игроков и отобразил бы квадрат размером 70. Поэтому я попытался умножить их на грех и потому что вращение Y, но это не сработало. Я уверен, что это возможно, я просто думаю, что что-то упустил. Как я могу достичь своей цели, только отображая то, что видит игрок.

Спасибо

Так же, как примечание, я попробовал отбраковку из фруструма, и это стало слишком медленным, я бы предпочел, чтобы это работало независимо от того, сколько у меня кубов

вместо рендеринга вышеуказанного идентификатора, как если бы он был, например, если игрок смотрит ->

...... ****
...... ****
......P****
...... ****

Ответы [ 2 ]

0 голосов
/ 09 сентября 2010

Я не совсем понимаю ваш код (70? CubeIsEmpty?), Но если Cube-frustum слишком медленный, вы можете попробовать сферу-Frustum.

http://www.chadvernon.com/blog/resources/directx9/frustum-culling/

0 голосов
/ 08 сентября 2010

После просмотра вашего кода еще раз, возможно, это ваша проблема:

PlayerPosition.x += 70.0f * float(sin(yrotrad));
PlayerPosition.y -= 20;
PlayerPosition.z += 70.0f * -(float(cos(yrotrad)));

и какие типы координат?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...