{{notification.text}}

MirGames

Daimos
26.03.10 13:41
0
Приветствую!

Нужно реализовать навигацию как в 3D Studio Max'е, т. е. при скроллинге
ролика мышки происходит изменение дистанции, при нажатии ролика и перемещения мышки
происходит изменение положения камеры и точки наблюдения по осям X и Y и при вращении
(Arc Rotation) происходит вращение положения камеры относительно точки наблюдения (помойму по следующим осям - XZ, YZ, XY, если не ошибаюсь конечно).

Хотелось бы увидеть пример как с gluLookAt, так и с glTranslate/glRotate?
#1
аксакал
26.03.10 18:56
0
Добро пожаловать на форум MirGames!
Код
procedure TDisplayCtrl.OnMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: LongInt);
begin
  if ssAlt in Shift then
    if ((CamDrag = cdRot) and (Button = mbMiddle)) or
       ((CamDrag = cdPos) and (Button = mbLeft)) then
      CamDrag := cdZoom
    else
      if ((CamDrag = cdZoom) and (Button = mbLeft)) or
         ((CamDrag = cdRot) and (Button = mbRight)) or
         (Button = mbMiddle) then
        CamDrag := cdPos
      else
        if Button = mbRight then
          CamDrag := cdZoom
        else
          CamDrag := cdRot;
  GetCursorPos(CamMPos);
end;

procedure TDisplayCtrl.OnMouseUp;
begin
  CamDrag := cdNone;
end;

procedure TDisplayCtrl.OnMouseMove(Shift: TShiftState; X, Y: LongInt);
const
  SENS_POS  = 0.0025;
  SENS_ROT  = 0.5;
  SENS_ZOOM = 0.003;
var
  D, L, U, v : TVec3f;
  Pos : TPoint;
begin
  GetCursorPos(Pos);
  D.x := sin(pi - CamRot.y * deg2rad) * cos(CamRot.x * deg2rad);
  D.y := -sin(CamRot.x * deg2rad);
  D.z := cos(pi - CamRot.y * deg2rad) * cos(CamRot.x * deg2rad);

  case CamDrag of
    cdPos :
      begin
        D := D.Normal;
        L := D.Cross(Vec3f(0, 1, 0));
        L := L.Normal;
        U := L.Cross(D);
        U := U.Normal;

        v := Vec3f(0, 0, 0);
        v := v - L * ((Pos.X - CamMPos.x) * SENS_POS * CamDist);
        v := v + U * ((Pos.Y - CamMPos.y) * SENS_POS * CamDist);
        CamPos := CamPos + v;
      end;
    cdRot :
      begin
        CamRot.x := CamRot.x + (Pos.Y - CamMPos.Y) * SENS_ROT;
        CamRot.y := CamRot.y + (Pos.X - CamMPos.X) * SENS_ROT;
        CamRot.x := Min(89.999, Max(-89.999, CamRot.x));
      end;
    cdZoom :
      CamDist := Max(0.01, Min(100, CamDist * (1 - ((Pos.X - CamMPos.X) + (Pos.Y - CamMPos.Y)) * SENS_ZOOM)));
  end;
  CamMPos := Pos;
end;

  procedure UpdateCamera;
  begin
    PM.Identity;
    PM.Perspective(68.039, Screen.Width/Screen.Height, 0.01, 100);

    VM.Identity;
    VM.Translate(Vec3f(0, 0, -CamDist));
    VM.Rotate(CamRot.x * deg2rad, Vec3f(1, 0, 0));
    VM.Rotate(CamRot.y * deg2rad, Vec3f(0, 1, 0));
    VM.Translate(Vec3f(-CamPos.x, -CamPos.y, -CamPos.z));

    gl.MatrixMode(GL_PROJECTION);
    gl.LoadMatrixf(PM);
    gl.MatrixMode(GL_MODELVIEW);
    gl.LoadMatrixf(VM);
  end;

Вот как-то так, реализуется Maya подобное управление (Alt + мышь)
Отредактировано: 26.03.10 19:45
#2
Daimos
27.03.10 11:50
0
XProger
Цитата
Добро пожаловать на форум MirGames!

Спасибо!

Благодарю за код, только мне придется сейчас их перевести на Си++ и опробовать на деле :)
#3
Daimos
17.09.10 02:31
0
Проблема у меня в самой камере. Картинка:
желтый кружок - позиция камеры в пространстве
белый кружок - точка куда направлена камера
синяя ось - направление Z
красная ось - направление X
зеленая ось - направление Y
светлосиняя сферическая лента - направление вращения по осям YZ
светлозеленая сферическая лента - направление вращения по осям XY
светлокрасная сферическая лента - направление вращения по осям XZ

Код

    vector3d camPosition, camTarget, camUp;
    vector3d tmpPos;
    float rotYZ, rotXY, rotXZ;

    void setupCamera()
    {
        tmpPos = camPosition; // копируем позицию камеры
        // вращаем вектор tmpPos относительно вектора camTarget
        // как то надо настроить camUp
        lookAt(tmpPos, camTarget, camUp);
    }


Как реализовать вращение вектора относительно другога вектора по осям XZ, YZ, XY, и как настроить up вектор? Т. е. нужно вращать положение камеры относительно точки наблюдения (направления взгляда). Как это реализовать с помощью кватернионов?
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}