> Перспективная проэкция
SloBrain
Отправлено: 5 апреля 2013 в 20:51
Post Id
cообщений: 3 пользователь offline

Здравствуйте) я активно читаю вашу статью про перспективную проэкцию, но ни чего не понимаю.
Преймущественно из-за того что там вы всё сводите к C++, а я на C++ перейду чуть позже.
Вы не могли бы объяснить мне эту тему не прибегая к языку C++ ?

 Top
Aceton
Отправлено: 5 апреля 2013 в 22:15
Post Id
cообщений: 155 администратор offline

о какой статье конкретно идет речь?))
задай конкретные вопросы)

Обновлено: 5 апреля 2013 в 22:16
 Top
SloBrain
Отправлено: 5 апреля 2013 в 22:33
Post Id
cообщений: 3 пользователь offline

DirectX/ Виртуальная камера

 Top
SloBrain
Отправлено: 5 апреля 2013 в 22:36
Post Id
cообщений: 3 пользователь offline

после проработки формулы перспективной проэкции переменные становятся нерационально малы

 Top
Aceton
Отправлено: 7 апреля 2013 в 22:01
Post Id
cообщений: 155 администратор offline

чето я такой фразы в статьях не нашел....
ссылку дай на статью)

 Top
nuanred
Отправлено: 30 апреля 2013 в 13:41
Post Id
cообщений: 5 пользователь offline

линк в студию!

 Top
IH63
Отправлено: 18 сентября 2013 в 17:39
Post Id
cообщений: 5 пользователь offline

Написал такой код (вообще это 2 файла, но так удобнее отправить)

код на языке код
#include <cmath>
const float EPSILON = 0.001f;
struct vertex//вершины
{float x,y,z;
unsigned long color;};
class vector3//3-хмерный вектор
{public:
float x,y,z;
vector3() : x(0), y(0), z(0) {}
vector3(vector3& v) : x(v.x), y(v.y), z(v.z) {}
vector3(float _x, float _y, float _z) : x(_x),y(_y),z(_z){}
vector3& operator=(vector3 v)
{x=v.x;
y=v.y;
z=v.z;
return *this;}
bool operator==(vector3 v)
{
	if (fabs(x-v.x) < EPSILON)
		if (fabs(y-v.y) < EPSILON)
			if (fabs(z-v.z) < EPSILON)
				return true;
	return false;}
float mag()
{
	return sqrt(x*x+y*y+z*z);
}
vector3 operator- ()
{
	return vector3(-x,-y,-z);
}
// сложение векторов
vector3 operator+ (vector3& v)
{
	return vector3(x+v.x,y+v.y,z+v.z);
}
// разность векторов
vector3 operator- (vector3& v)
{
	return vector3(x-v.x,y-v.y,z-v.z);
}
// умножение вектора  на скаляр
vector3 operator* (float& a)
{
	return vector3(x*a,y*a,z*a);
}
// деление вектора  на скаляр
vector3 operator/ (float& a)
{
	float b = 1.0f / a;
	return vector3 (x*b,y*b,z*b);
}
// скалярное произедение векторов (dot product)
float operator* (vector3& v)
{
	return x*v.x+y*v.y+z*v.z;
}
// векторное произведение векторов (cross product)
vector3 Cross(vector3& v)
{
	return vector3(y*v.z - z*v.y, z*v.x - x*v.z, x*v.y - y*v.x);
}

vector3& operator+= (vector3& v)
{
	x += v.x; y += v.y; z += v.z;
	return *this;
}

vector3& operator-= (vector3& v)
{
	x -= v.x; y -= v.y; z -= v.z;
	return *this;
}

vector3& operator*= (float& a)
{
	x *= a; y *= a; z *= a;
	return *this;
}

vector3& operator/= (float& a)
{
	float b = 1.0f/a;
	x *= b; y *= b; z *= b;
	return *this;
}
void Normalize ()
{
  float magnitude = mag();
  if (magnitude > 0)
  {
    float invertedMag = 1 / magnitude;
    x *= invertedMag;
    y *= invertedMag;
    z *= invertedMag;
  }
}
};
class vector4//4-хмерный вектор
{public:
float x,y,z,w;
vector4(){x=0;
y=0;
z=0;
w=1;}
vector4(vector4 &v)
{x=v.x;
y=v.y;
z=v.z;
w=v.w;}
vector4(float _x, float _y, float _z, float _w)
{x=_x;
y=_y;
z=_z;
w=_w;}
vector4& operator=(vector4 v)
{x=v.x;
y=v.y;
z=v.z;
w=v.w;
return *this;}
bool operator==(vector4 v)
{
	if (fabs(x-v.x) < EPSILON)
		if (fabs(y-v.y) < EPSILON)
			if (fabs(z-v.z) < EPSILON)
				return true;
	return false;}
float mag()
{
	return sqrt(x*x+y*y+z*z);
}
vector4 operator- ()
{
	return vector4(-x,-y,-z,w);
}
// сложение векторов
vector4 operator+ (vector4& v)
{
	return vector4(x+v.x,y+v.y,z+v.z,(w+v.w)/2);
}
// разность векторов
vector4 operator- (vector4& v)
{
	return vector4(x-v.x,y-v.y,z-v.z,(w+v.w)/2);
}
// умножение вектора  на скаляр
vector4 operator* (float& a)
{
	return vector4(x*a,y*a,z*a,w);
}
// деление вектора  на скаляр
vector4 operator/ (float& a)
{
	float b = 1.0f / a;
	return vector4 (x*b,y*b,z*b,w);
}
// скалярное произедение векторов (dot product)
float operator* (vector4& v)
{
	return x*v.x+y*v.y+z*v.z;
}
// векторное произведение векторов (cross product)
vector4 Cross(vector4& v)
{
	return vector4(y*v.z - z*v.y, z*v.x - x*v.z, x*v.y - y*v.x,(w+v.w)/2);
}

vector4& operator+= (vector4& v)
{
	x += v.x; y += v.y; z += v.z;
	return *this;
}

vector4& operator-= (vector4& v)
{
	x -= v.x; y -= v.y; z -= v.z;
	return *this;
}

vector4& operator*= (float& a)
{
	x *= a; y *= a; z *= a;
	return *this;
}

vector4& operator/= (float& a)
{
	float b = 1.0f/a;
	x *= b; y *= b; z *= b;
	return *this;
}
void Normalize ()
{
  float magnitude = mag();
  if (magnitude > 0)
  {
    float invertedMag = 1 / magnitude;
    x *= invertedMag;
    y *= invertedMag;
    z *= invertedMag;
  }
}
};
class Matrix//матрицы
{public:
float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
Matrix();//конструктор
void RotationAroundAxis(vector3 &, float);//вращение
};
Matrix::Matrix () : _11(1), _12(0), _13(0), _14(0),
                    _21(0), _22(1), _23(0), _24(0),
                    _31(0), _32(0), _33(1), _34(0),
                    _41(0), _42(0), _43(0), _44(1)
{}
void Matrix::RotationAroundAxis(vector3& v, float angle)
{
  _11 = v.x * v.x * (1 - cos(angle)) + cos(angle);
  _12 = v.x * v.y * (1 - cos(angle)) + v.z * sin(angle);
  _13 = v.x * v.z * (1 - cos(angle)) - v.y * sin(angle);

  _21 = v.x * v.y * (1 - cos(angle)) - v.z * sin(angle);
  _22 = v.y * v.y * (1 - cos(angle)) + cos(angle);
  _23 = v.y * v.z * (1 - cos(angle)) + v.x * sin(angle);

  _31 = v.x * v.z * (1 - cos(angle)) + v.y * sin(angle);
  _32 = v.y * v.z * (1 - cos(angle)) - v.x * sin(angle);
  _33 = v.z * v.z * (1 - cos(angle)) + cos(angle);
}
void multiplication (vector4& v, Matrix& m)
{
  v.x = v.x * m._11 + v.y * m._21 + v.z * m._31 + v.w * m._41;
  v.y = v.x * m._12 + v.y * m._22 + v.z * m._32 + v.w * m._42;
  v.z = v.x * m._13 + v.y * m._23 + v.z * m._33 + v.w * m._43;
  v.w = v.x * m._14 + v.y * m._24 + v.z * m._34 + v.w * m._44;
}
//перемножение вектора  на матрицу
void multiplication (vector3& v, Matrix& m)
{
  v.x = v.x * m._11 + v.y * m._21 + v.z * m._31;
  v.y = v.x * m._12 + v.y * m._22 + v.z * m._32;
  v.z = v.x * m._13 + v.y * m._23 + v.z * m._33;
}
void transformations (vertex& Vertex, vector4& vector, Matrix& matWorld,
                      Matrix& matCam, Matrix& matProj)//изменение вектора
{
  vector4 tempv = vector;
  multiplication(tempv,matWorld);
  multiplication(tempv,matCam);
  multiplication(tempv,matProj);
  tempv.x /= tempv.w;
  tempv.y /= tempv.w;
  tempv.z /= tempv.w;
  tempv.w /= tempv.w;
  Vertex.x = tempv.x;
  Vertex.y = tempv.y;
  Vertex.z = tempv.z;
}

class MovableObject//класс объекта
{vector3 i,j,k,v;
public:
	MovableObject () : i(1,0,0), j(0,1,0), k(0,0,1), v(0,0,0) {}
	void Heading(float angle)//вращение  по у
{
  Matrix rotationMatrix;
  angle = angle*3.14f/180;
  rotationMatrix.RotationAroundAxis(vector3(0,1,0),angle);
  multiplication(i,rotationMatrix);
  multiplication(k,rotationMatrix);
}
void Bank(float angle)//вращение  по z (отсутствует
{
  Matrix rotationMatrix;
  angle = angle*3.14f/180;
  rotationMatrix.RotationAroundAxis(k,angle);
  multiplication(i,rotationMatrix);
  multiplication(j,rotationMatrix);	
}

void Pitch(float angle)//вращение  по х
{
  Matrix rotationMatrix;
  angle = angle*3.14f/180;
  rotationMatrix.RotationAroundAxis(vector3(i.x,0,i.z),angle);
  multiplication(j,rotationMatrix);
  multiplication(k,rotationMatrix);
}
void Strafe(float dx) { v += vector3(i.x,0,i.z) * dx; }//смещение
void Fly (float dy)   { v += vector3(0,j.y,0) * dy; }
void Walk (float dz)  { v += vector3(k.x,0,k.z) * dz; }
void CreateMatWorld(Matrix& matCam)//переход  к мировой матрице
{
  k.Normalize();
  j = k.Cross(i);
  j.Normalize();
  i = j.Cross(k);
  i.Normalize();
  matCam._11 = i.x;
  matCam._12 = i.y;
  matCam._13 = i.z;
  matCam._21 = j.x;
  matCam._22 = j.y;
  matCam._23 = j.z;
  matCam._31 = k.x;
  matCam._32 = k.y;
  matCam._33 = k.z;
  matCam._41 = v.x;
  matCam._42 = v.y;
  matCam._43 = v.z;
}};
class Camera//класс камеры
{vector3 i,j,k,v;
public:
	void Heading(float angle)
{
  Matrix rotationMatrix;
  angle = angle*3.14f/180;
  rotationMatrix.RotationAroundAxis(vector3(0,1,0),angle);
  multiplication(i,rotationMatrix);
  multiplication(k,rotationMatrix);
}
	float angleAroundZ;
	void Bank(float angle)
{
  if (angleAroundZ < 45 && angleAroundZ > -45)
    angleAroundZ += angle;
  if ((angleAroundZ >= 45 && angle > 0) || (angleAroundZ <= -45 && angle < 0))
  {
    angleAroundZ -= angle;
    return;
  }
  Matrix RotationMatrix;
  angle = angle*3.14f/180;
  RotationMatrix.RotationAroundAxis(k,angle);
  multiplication(i,RotationMatrix);
  multiplication(j,RotationMatrix);
}
void Pitch(float angle)
{
  Matrix rotationMatrix;
  angle = angle*3.14f/180;
  rotationMatrix.RotationAroundAxis(vector3(i.x,0,i.z),angle);
  multiplication(j,rotationMatrix);
  multiplication(k,rotationMatrix);
}
void Strafe(float dx) { v += vector3(i.x,0,i.z) * dx; }
void Fly (float dy)   { v += vector3(0,j.y,0) * dy; }
void Walk (float dz)  { v += vector3(k.x,0,k.z) * dz; }
Camera () : i(1,0,0), j(0,1,0), k(0,0,1), v(0,0,0) {}
void CreateMatCam(Matrix& matCam)//переход  к матрице камеры
{
  k.Normalize();
  j = k.Cross(i);
  j.Normalize();
  i = j.Cross(k);
  i.Normalize();
  matCam._11 = i.x;
  matCam._12 = j.x;
  matCam._13 = k.x;
  matCam._21 = i.y;
  matCam._22 = j.y;
  matCam._23 = k.y;
  matCam._31 = i.z;
  matCam._32 = j.z;
  matCam._33 = k.z;
  matCam._41 = -(i*v);
  matCam._42 = -(j*v);
  matCam._43 = -(k*v);
}
};
#define INITGUID
#include <Windows.h>
#include <d3d9.h>
#include "Microsoft DirectX SDK (June 2010)\Include\d3dx9.h"
#include <dinput.h>
#define DIRECTINPUT_VERSION 0x800
#pragma comment(lib, "d3d9.lib")
//#pragma comment(lib, "d3dx9.lib")
#pragma comment(lib, "dinput8.lib")
HWND hWnd;
MovableObject cube;
Camera camera;
vertex Cube[8];
vertex Obj[8];
LRESULT __stdcall WndProc(HWND hWnd, UINT message,
             WPARAM wParam, LPARAM lParam)//обработчик сообщений
{
  switch (message)
  {
  case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
  case WM_CLOSE:
    exit(0);
  case WM_QUIT:
    return 0;
  default:
      return DefWindowProc(hWnd,message,wParam,lParam);
}

  return 0;}
IDirectInput8* di=0;//переменные
IDirectInputDevice8* mouse=0,*keyboard=0;
char buffer[256];
DIMOUSESTATE dims;
IDirect3D9* d3d=0;
IDirect3DDevice9* videocard=0;
IDirect3DVertexBuffer9* vb = NULL,*ob=NULL;
IDirect3DIndexBuffer9* ib=NULL;
vector4 vertices[8] = 
{
  vector4(-1,-1,-1,1),
  vector4(-1,1,-1,1),
  vector4(1,-1,-1,1),
  vector4(1,1,-1,1),
  vector4(-1,-1,1,1),
  vector4(-1,1,1,1),
  vector4(1,-1,1,1),
  vector4(1,1,1,1)
};
unsigned short indices[]={
  0, 1, 2,
  1, 3, 2,
  0, 1, 5,
  0, 4, 5,
  4, 5, 6,
  5, 7, 6,
  2, 3, 7,
  2, 6, 7,
  0, 2, 6,
  0, 4, 6,
  1, 3, 7,
  1, 5, 7,
};

vector4 object[]=
{vector4(-3,-3,-3,1),
  vector4(-3,3,-3,1),
  vector4(3,-3,-3,1),
  vector4(3,3,-3,1),
  vector4(-3,-3,3,1),
  vector4(-3,3,3,1),
  vector4(3,-3,3,1),
  vector4(3,3,3,1)
};
unsigned short index[]={
  0, 1, 2,
  1, 3, 2,
  0, 1, 5,
  0, 4, 5,
  4, 5, 6,
  5, 7, 6,
  2, 3, 7,
  2, 6, 7,
  0, 2, 6,
  0, 4, 6,
  1, 3, 7,
  1, 5, 7,
};
Matrix matWorld,matCam,matProj;
bool Init(HINSTANCE hInstance)//инициализация
{
  
 if FAILED( DirectInput8Create(hInstance,           // экземпляр приложения
               DIRECTINPUT_VERSION, // версия DirectInput
               IID_IDirectInput8,   // глобальный идентификатор (COM)
               (void**)&di, // адрес указателя объекта DirectInput
               NULL))return 0;
 if FAILED(di->CreateDevice(GUID_SysKeyboard,  // устройство ввода   с клавиатуры
             &keyboard,            // адрес указателя   на устройство
             NULL))return 0;
 keyboard->SetDataFormat(&c_dfDIKeyboard);
keyboard->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
keyboard->Acquire();
if(FAILED(di->CreateDevice(GUID_SysMouse,  // устройство ввода   с мыши
  &mouse,                        // адрес указателя   на устройство
  NULL)))return 0;

mouse->SetDataFormat(&c_dfDIMouse);
mouse->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
mouse->Acquire();
if FAILED(d3d = Direct3DCreate9(D3D_SDK_VERSION))return 0;

  D3DPRESENT_PARAMETERS pp;
  ZeroMemory(&pp,sizeof(pp));

  pp.BackBufferWidth = 500;
  pp.BackBufferHeight = 500;
  pp.BackBufferFormat = D3DFMT_X8R8G8B8;
  pp.BackBufferCount = 1;
  pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  pp.hDeviceWindow = hWnd;
  pp.Windowed = true;
  if FAILED(d3d->CreateDevice(D3DADAPTER_DEFAULT,
                    D3DDEVTYPE_REF,hWnd,
                    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                    &pp, &videocard))return 0;
  
  videocard->CreateVertexBuffer( 8*sizeof(vertex), D3DUSAGE_WRITEONLY,
                         D3DFVF_XYZ|D3DFVF_DIFFUSE, D3DPOOL_DEFAULT,
                         &vb,NULL);
videocard->CreateVertexBuffer( 8* sizeof(vertex), D3DUSAGE_WRITEONLY,
                         D3DFVF_XYZ|D3DFVF_DIFFUSE, D3DPOOL_DEFAULT,
                         &ob,NULL);
videocard->CreateIndexBuffer( 72*sizeof(unsigned short),
                        D3DUSAGE_WRITEONLY, D3DFMT_INDEX16,
                        D3DPOOL_DEFAULT, &ib, NULL );
videocard->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE );
videocard->SetRenderState( D3DRS_LIGHTING, FALSE );
return 1;
}
void Delete()//удаление
{
if(ib!=NULL)ib->Release();
if(ob!=NULL)ob->Release();
if(vb!=NULL)vb->Release();
if(videocard!=NULL)videocard->Release();
if(d3d!=NULL)d3d->Release();
if(keyboard!=NULL){keyboard->Unacquire();
keyboard->Release();}
if(mouse!=NULL){mouse->Unacquire();
mouse->Release();}
if(di!=NULL)di->Release();}
void Input()//ввод
{if FAILED(mouse->GetDeviceState(sizeof(DIMOUSESTATE),&dims))mouse->Acquire();
if FAILED(keyboard->GetDeviceState(sizeof(buffer),buffer))keyboard->Acquire();
camera.Heading(dims.lY);
camera.Bank(dims.lZ);
camera.Pitch(dims.lX);
int dx=0,dy=0,dz=0;
if(buffer[DIK_A]||buffer[DIK_LEFT])dx--;
if(buffer[DIK_D]||buffer[DIK_RIGHT])dx++;
if(buffer[DIK_W]||buffer[DIK_UP])dy--;
if(buffer[DIK_S]||buffer[DIK_DOWN])dy++;
if(buffer[DIK_R])dz++;
if(buffer[DIK_F])dz--;
cube.Fly(dy);
cube.Strafe(dx);
cube.Walk(dz);
camera.Fly(dy);
camera.Strafe(dx);
camera.Walk(dz);}
void Rendering()//рисование
{Input();
camera.CreateMatCam(matCam);
cube.CreateMatWorld(matWorld);
for(int i=0;i<8;i++){Cube[i].color=0x00ffffff;
transformations(Cube[i],vertices[i],matWorld,matCam,matProj);
Obj[i].color=0x00ffffff;
transformations(Obj[i],object[i],matWorld,matCam,matProj);
}
void *vvb=NULL, *iib=NULL, *ovb=NULL, *oib=NULL;
vb->Lock(0,sizeof(Cube),(void**)&vvb,0);
memcpy(vvb,Cube,sizeof(Cube));
vb->Unlock();
ob->Lock(0,sizeof(Obj),(void**)&ovb,0);
memcpy(ovb,Obj,sizeof(Obj));
ob->Unlock();
ib->Lock(0,sizeof(indices)+sizeof(index),(void**)&iib,0);
memcpy(iib,indices,sizeof(indices));
iib = static_cast<unsigned short*>(iib) + 36;
memcpy(iib,index,sizeof(index));
ib->Unlock();
videocard->BeginScene();
videocard->SetStreamSource(0,vb,0,sizeof(vertex));
videocard->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,12);
videocard->SetStreamSource(0,vb,0,sizeof(vertex));
videocard->DrawIndexedPrimitive(D3DPT_LINELIST,0,0,8,36,12);
videocard->EndScene();
videocard->Present(NULL,NULL,NULL,NULL);}
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                      LPSTR lpCmdLine, int nCmdShow)//главная функция
{WNDCLASS wc;
  wc.style = CS_OWNDC;
  wc.lpfnWndProc = WndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hbrBackground = (HBRUSH)(6);
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  wc.hInstance = hInstance;
  wc.lpszClassName = L"class";
  wc.lpszMenuName = NULL;

  if FAILED(RegisterClass(&wc))return 0;

  if(FAILED(hWnd = CreateWindow(L"class",L"Проверка камеры DirectX-самостоятельная работа",
                           WS_OVERLAPPEDWINDOW,200,100,
                           500,500,NULL,NULL,hInstance,NULL)))return 0;
  ShowWindow(hWnd,nCmdShow);
  UpdateWindow(hWnd);
  Init(hInstance);
MSG msg;
while(true){
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
      if (msg.message == WM_QUIT)
        break;
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    Rendering();}
}
Delete();
return 0;}

Компиляция никаких ошибок не видит, при запуске не вылетает, но вместо 2 кубов пустое окно. Подскажите, как с этим быть

 Top
stigGGG
Отправлено: 6 октября 2013 в 00:15
Post Id
cообщений: 1 пользователь offline

помогите я хочу сделать гоночку на директ3д, как мне сделать так, что бы я просто появился на трассе в машине.

 Top
Aceton
Отправлено: 19 декабря 2013 в 21:18
Post Id
cообщений: 155 администратор offline

Исходники и пример залит
http://gamesmaker.ru/programming/directx/virtualnaya-kamera-realizaciya-chast-vtoraya/

--

stigGGG пишет: помогите я хочу сделать гоночку на директ3д, как мне сделать так, что бы я просто появился на трассе в машине.

почитать книжки? О.о

Обновлено: 19 декабря 2013 в 21:19
 Top
treningur
Отправлено: 17 апреля 2018 в 02:09
Post Id
cообщений: 5 пользователь offline

Та книжечек надо читать много и долго.. мы пока в универе разбирались чуть не опухли)

 Top
Voltov
Отправлено: 12 марта 2020 в 16:54
Post Id
cообщений: 6 пользователь offline

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

 Top
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
 



Новые сообщения