Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using Tao.FreeGlut;
- using Tao.OpenGl;
- using Tao.Platform.Windows;
- namespace SRTM_TerrainViewer
- {
- class Camera
- {
- private struct Vector3D
- {
- public float x, y, z;
- }
- private Vector3D Cross(Vector3D vV1, Vector3D vV2, Vector3D vVector2)
- {
- Vector3D vNormal;
- Vector3D vVector1;
- vVector1.x = vV1.x - vV2.x;
- vVector1.y = vV1.y - vV2.y;
- vVector1.z = vV1.z - vV2.z;
- // нормаль к плоскости через два вектора
- // Значение X для вектора = (V1.y * V2.z) - (V1.z * V2.y)
- vNormal.x = ((vVector1.y * vVector2.z) - (vVector1.z * vVector2.y));
- // Значение Y = (V1.z * V2.x) - (V1.x * V2.z)
- vNormal.y = ((vVector1.z * vVector2.x) - (vVector1.x * vVector2.z));
- // Значение Z = (V1.x * V2.y) - (V1.y * V2.x)
- vNormal.z = ((vVector1.x * vVector2.y) - (vVector1.y * vVector2.x));
- return vNormal;
- }
- private float Magnitude(Vector3D vNormal)
- {
- return (float)Math.Sqrt((vNormal.x * vNormal.x) +
- (vNormal.y * vNormal.y) +
- (vNormal.z * vNormal.z));
- }
- private Vector3D Normalize(Vector3D vVector)
- {
- float magnitude = Magnitude(vVector);
- vVector.x = vVector.x / magnitude;
- vVector.y = vVector.y / magnitude;
- vVector.z = vVector.z / magnitude;
- return vVector;
- }
- public void Position_Camera(float pos_x, float pos_y, float pos_z,
- float view_x, float view_y, float view_z,
- float up_x, float up_y, float up_z)
- {
- mPos.x = pos_x; // Позиция камеры
- mPos.y = pos_y; //
- mPos.z = pos_z; //
- mView.x = view_x; // Куда смотрит, т.е. взгляд
- mView.y = view_y; //
- mView.z = view_z; //
- mUp.x = up_x; // Вертикальный вектор камеры
- mUp.y = up_y; //
- mUp.z = up_z; //
- }
- public void Rotate_View(float speed)
- {
- Vector3D vVector; // Полчим вектор взгляда
- vVector.x = mView.x - mPos.x;
- vVector.y = mView.y - mPos.y;
- vVector.z = mView.z - mPos.z;
- mView.z = (float)(mPos.z + Math.Sin(speed) * vVector.x + Math.Cos(speed) * vVector.z);
- mView.x = (float)(mPos.x + Math.Cos(speed) * vVector.x - Math.Sin(speed) * vVector.z);
- }
- public void update()
- {
- Vector3D vCross = Cross(mView, mPos, mUp);
- // Нормализуем вектор стрейфа
- mStrafe = Normalize(vCross);
- }
- public void upDown(float speed)
- {
- mPos.y += speed;
- }
- public void TestPosSet(float x, float y, float z)
- {
- mPos.x = x;
- mPos.y = y;
- mPos.z = z;
- }
- public void TestViewSet(float x, float y, float z )
- {
- mView.x = x;
- mView.y = y;
- mView.z = z;
- }
- public void Look()
- {
- Glu.gluLookAt(mPos.x, mPos.y, mPos.z,
- mView.x, mView.y, mView.z,
- mUp.x, mUp.y, mUp.z);
- }
- public float getPosX() // Возвращает позицию камеры по Х
- {
- return mPos.x;
- }
- public float getPosY() // Возвращает позицию камеры по Y
- {
- return mPos.y;
- }
- public float getPosZ() // Возвращает позицию камеры по Z
- {
- return mPos.z;
- }
- public float getViewX() // Возвращает позицию взгляда по Х
- {
- return mView.x;
- }
- public float getViewY() // Возвращает позицию взгляда по Y
- {
- return mView.y;
- }
- public float getViewZ() // Возвращает позицию взгляда по Z
- {
- return mView.z;
- }
- private Vector3D mPos; // Вектор позиции камеры
- private Vector3D mView; // Направление, куда смотрит камера
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement