Разработка и ромхакинг > Ромхакинг и программирование
какие программы использовать для создания своих игр?
<< < (8/11) > >>
Mr2:

--- Цитата: r57shell от 07 Апрель 2011, 20:25:16 ---За пол года крутые улучшения  :lol:.

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

Один день приводил исходник в нормальный вид.
Один день согласовывал масштабы.
Один день думал как реализовать прокрутку.

Теперь код усложнился и его снова нужно оптимизировать,не до колизий. ;)
Mr2:
Отрисовывать 3D объекты можно только через 3D API функции?
Или можно и через 2D функции отрисовывать трёхмерные объекты?
r57shell:
:lol:
а на каком дисплее ты видишь 3D объекты?) - На 2D
Так что... рисованный 3D объект это иллюзия 3D. Главное правильно нарисовать.
Но тут если ты о применении... то 3D функциями и проще, и работать будет быстрее, ибо графическая карта под это заточена.
А 2D-функциями... это что-то на подобии software эмуляции...

Да и если говорить о 3D которое на стереоскопических дисплеях, то и такое без 3D функций и поддержки делать вообще гемор.
Mr2:

--- Цитата: r57shell от 15 Август 2011, 19:34:46 ---:lol:
а на каком дисплее ты видишь 3D объекты?) - На 2D
Так что... рисованный 3D объект это иллюзия 3D. Главное правильно нарисовать.
--- Конец цитаты ---
Вот чего я и спросил.

--- Цитата: r57shell от 15 Август 2011, 19:34:46 ---Но тут если ты о применении... то 3D функциями и проще, и работать будет быстрее, ибо графическая карта под это заточена.
--- Конец цитаты ---
Пока хочу всё стандартное попробывать.(за маленьким исключением)

В WIN32 API есть 3D функции?

--- Цитата: r57shell от 15 Август 2011, 19:34:46 ---А 2D-функциями... это что-то на подобии software эмуляции...
--- Конец цитаты ---
Как програмно реализовать Z-координату?(желательно в теории, а то я в синусах не бум-бум ;))
2D функция у меня такая:
бумага.точка(ширина, высота, цвет);

--- Цитата: r57shell от 15 Август 2011, 19:34:46 ---Да и если говорить о 3D которое на стереоскопических дисплеях, то и такое без 3D функций и поддержки делать вообще гемор.

--- Конец цитаты ---
Не, это я в курсе как делается.
r57shell:

--- Цитата: Mr2 от 15 Август 2011, 22:26:00 ---В WIN32 API есть 3D функции?

--- Конец цитаты ---
нету


--- Цитата: Mr2 от 15 Август 2011, 22:26:00 ---Как програмно реализовать Z-координату?(желательно в теории, а то я в синусах не бум-бум ;))

--- Конец цитаты ---
Z-координата это всего лишь значение, как его хранить - как хочешь.

"обычно" далее означает - я только с таким сталкивался, и сам так делал :). То есть мое представление.
Лучше всего прочитать что такое базис векторного пространства... (да и вообще векторные пространства, линейная геометрия)
Затем, модели обычно задаются множеством треугольников в некотором базисе, который обычно называется "локальная система координат". Треугольники задаются вершинами.
Потом модели анимируются изменением вершин или текстур...
Позиционируются (и задаётся ориентация) за счёт матриц.
Т.к. одна матрица 4x4 задаёт полную ориентацию в 3D пространстве.
Затем обычно составляется 3 основных матрицы
WORLD, VIEW, PROJECTION - мир, вид, проекция соответственно, с помощью их уже проецируются вершины на экран.
Затем уже на плоскости с некоторой дополнительной информацией (текстуры, нормали...) пикселезируются так скажем (закрашиваются).
Матрица WORLD обычно получается из иерархии, так скажем, "относительности", она по сути означает базис в котором "в мире" отрисовать объект. Матрица VIEW определяется с помощью положения камеры (обычно). И наконец PROJECTION это ТУПО как спроецировать объекты на экран.
Таким образом, просто работает комбайн:
1) задать WORLD, VIEW, PROJECTION
2) задать текстуры, освещение, другие параметры
3) отрисовать модель (в узком смысле - набор треугольников)
4) перейти к следуйщей модели,и сначала.
а потом когда отрисовка закончилась, просчитать что изменилось к следуйщему кадру, и снова в комбайн все модели :).

Итого тебе понадобиться чтобы осилить:
1) знание матриц, и как они представляют отношение между ориентациями в пространстве, и как задают ориентацию. Другими словами как их готовить, и с чем их едят.
2) знания линейной геометрии.
если же захочешь ещё и текстурировать, то прийдётся попыхтеть... Лучше сразу не бросаться в эмуляцию 3D с помощью 2D, а для начала копнуть например OpenGL.  
Mr2:
r57shell Спасибо! :)

--- Цитата ---нету
--- Конец цитаты ---
Что то мне это подсказывало. ;)

--- Цитата ---Z-координата это всего лишь значение, как его хранить - как хочешь.
--- Конец цитаты ---
Это то понятно. Вопрос в том как мне её реализовать.
Ведь у меня нет трёхмерной функции, то есть я не могу напрямую её(Z) использовать:
бумага.точка(ширина, высота, глубина, цвет);
Поэтому её надо как то преобразовавать между X и Y.То есть:
1.Преобразовываем X и Y с учётом Z. Получаем трёхмерные координаты точки в двух переменных(X, Y).
2.бумага.точка(ширина, высота, цвет);

--- Цитата ---Лучше всего прочитать что такое базис векторного пространства... (да и вообще векторные пространства, линейная геометрия)
--- Конец цитаты ---
Я там нихрена не могу понять. То что вектор это направления я в курсе. Допустим вектор направления из точки А в точку Б.

--- Код: ---Данная матрица определяет следующее преобразование: растяжение по оси x в два раза, по оси у в три раза и перенос на вектор (1, 2, -1). При этом матрица M применяется к вектору-столбцу слева:

             | M11  M12  M13  M14 |   | px |  
p' = M * p = | M21  M22  M23  M24 | * | py |

             | M31  M32  M33  M34 |   | pz |  

             | M41  M42  M43  M44 |   | 1  |

--- Конец кода ---
http://compgraphics.info/3D/3d_definitions.php

--- Цитата ---Затем, модели обычно задаются множеством треугольников в некотором базисе, который обычно называется "локальная система координат". Треугольники задаются вершинами.
Потом модели анимируются изменением вершин или текстур...
Позиционируются (и задаётся ориентация) за счёт матриц.
Т.к. одна матрица 4x4 задаёт полную ориентацию в 3D пространстве.
Затем обычно составляется 3 основных матрицы
--- Конец цитаты ---
Как создаются 3D модели я в курсе. Матрицы используются для изменения координат вершин.

--- Цитата ---если же захочешь ещё и текстурировать, то прийдётся попыхтеть...
--- Конец цитаты ---
Достаточно создать куб, повертеть его, ну мож ещё по сторанам буквы написать.(текстуру натянуть)

Допустим красный квадрат я смогу нарисовать двухмерной функцией, и сделать над ним преобразования,

--- Код: ---4 раза{
 бумага.точка(red[i].x, red[i].y, цвет);
}
--- Конец кода ---
Но для остальных квадратов нужна глубина(Z).

--- Код: ---
 бумага.точка(малиновый[0].x, малиновый[0].y, цвет);
 бумага.точка(малиновый[1].x, малиновый[1].y, цвет);
--- Конец кода ---
допустим это две точки примыкаюзие к красному.
Далее оставшиеся две точки  нужно отдалять от красного квадрата к синему:

--- Код: ---
 бумага.точка(малиновый[2].x, малиновый[2].y,малиновый[2].z, цвет);
 бумага.точка(малиновый[3].x, малиновый[3].Y,малиновый[3].z, цвет);
--- Конец кода ---

--- Цитата ---Лучше сразу не бросаться в эмуляцию 3D с помощью 2D, а для начала копнуть например OpenGL.
--- Конец цитаты ---
Да не, я просто набираю знаний для хакинга. Проверку знаний осуществляю путём реализации их на движке.2D отрисовываю, анимирую, сталкиваю. Остались звуки. Ну и 3D :'(.
Что то серьёзное на PC пока не планировал, поэтому обхожусь стандартным С++.(без Win api, OpenGL, DirectX )


r57shell:

--- Цитата: Mr2 от 16 Август 2011, 19:29:45 ---Вопрос в том как мне её реализовать.

--- Конец цитаты ---
как раз таки я на реализацию и ответил, "всеголишь информация, куда хочешь туда и пихай".

Ты же хочешь как правильно ею пользоваться, точнее чтобы Z стал Z.
Всё что я описывал - это про видео игры, там обычно напрямую не используют. WORLD, VIEW, PROJECTION и многое в совокупности. Одни x,y,z ничего не дают.
Однако если для простеньких программ... то можно например что-то на подобии изометрии (я не помню как это называется).
выбираешь 3 вектора i,j,k=(x,y) на плоскости экрана. И выбираешь точку O=(x,y) тоже на плоскости экрана.
после чего рисуешь модель основываясь на том что если нужно X=(x,y,z) спроецировать на экран, и P=(x,y) - проекция, то P=X.x*i+X.y*j+X.z*k. На самом деле эта "проекция" записывается одной матрицей. P=X*A, где A - матрица. После такой проекции, параллельные линии в 3D будут параллельны в 2D, но не наоборот.
Так же кстати можно с 4D. только i,j,k,l будут 4 вектора.

--- Цитата: Mr2 от 16 Август 2011, 19:29:45 ---Ведь у меня нет трёхмерной функции, то есть я не могу напрямую её(Z) использовать:

--- Конец цитаты ---
и всёравно это будет не напрямую использование.

--- Цитата: Mr2 от 16 Август 2011, 19:29:45 ---Допустим вектор направления из точки А в точку Б.

--- Конец цитаты ---
Это другой вектор :).
Я подразумевал "радиус вектор".


--- Цитата: Mr2 от 16 Август 2011, 19:29:45 ---Достаточно создать куб, повертеть его, ну мож ещё по сторанам буквы написать.(текстуру натянуть)

--- Конец цитаты ---
тот пример что я в этом сообщении выше привел, даст тебе крутить только САМ куб, или перемещать. угол под которым ты его будешь смотреть, и прочее - будет фиксирован, прийдётся поворачивать куб к "камере". Так делать не трушно, обычно крутят камеру. Хотя, на самом деле, это только так подразумевают, на самом деле крутиться весь мир вокруг камеры ), но просто идёт удобное разделение, что явно нигде не крутишь весь мир, только перемещаешь камеру.


--- Цитата: Mr2 от 16 Август 2011, 19:29:45 ---Да не, я просто набираю знаний для хакинга.

--- Конец цитаты ---
Таких знаний не нужно для хакинга, достаточно знать что такое камера и как работает, и что такое модели, и их иерархию, или ещё подобное... да и вообще, зачем тебе хакать графический движок? он же обычно такой огромный, что ты не осилишь. Лучше использовать готовые функции движка, а там особого ума не надо.
Mr2:

--- Цитата ---Ты же хочешь как правильно ею пользоваться, точнее чтобы Z стал Z.
Всё что я описывал - это про видео игры, там обычно напрямую не используют. WORLD, VIEW, PROJECTION и многое в совокупности. Одни x,y,z ничего не дают.
Однако если для простеньких программ... то можно например что-то на подобии изометрии (я не помню как это называется).
выбираешь 3 вектора i,j,k=(x,y) на плоскости экрана. И выбираешь точку O=(x,y) тоже на плоскости экрана.
после чего рисуешь модель основываясь на том что если нужно X=(x,y,z) спроецировать на экран, и P=(x,y) - проекция, то P=X.x*i+X.y*j+X.z*k. На самом деле эта "проекция" записывается одной матрицей. P=X*A, где A - матрица. После такой проекции, параллельные линии в 3D будут параллельны в 2D, но не наоборот.
Так же кстати можно с 4D. только i,j,k,l будут 4 вектора.
--- Конец цитаты ---
Не понял о чём ты.
Вот попробывал реализовать что знаю ;):

--- Код: ---// 17.08.2011 Cube.
// Author by Mr2.
#include<iostream>
#include "playpen.h"
#include "keyboard.h"
#include <cmath>

using namespace std;
using namespace fgw;

struct point{
 int x;
 int y;
 int z;
};

void drawLine(playpen & paper,int x1, int y1, int x2, int y2, int const colour);
void drawPoints(playpen & paper, point cubePoints[], int const VERTEX_SUM);
void cubeScale(point cubePoints[],char operation, int const VERTEX_SUM);
void cubeMove(point cubePoints[],char operation, int const VERTEX_SUM);
void cubeRotate();
int main(){
 playpen paper;
 paper.scale(2);
 keyboard keyb; //Объект клавиотуры.
 int colour=0;
 char operation;
 const int VERTEX_SUM =8;
 const int RED=192, BLUE=15, GREEN=57, YELLOW=-39, PURPLE=68, BLACK=0;
 cout <<"  Qube by Mr2 " <<endl;
 cout <<"     v 0.1 " <<endl;
 cout <<"    Controll: " <<endl;
 cout <<"  Move: A D W S " <<endl;
 cout <<" Scale: E Q X Z " <<endl;
 cout <<"    Exit: R " <<endl;
 point cube[VERTEX_SUM]={ //Распологаем точки по часовой стрелке начиная с левого нижнего.
  cube[0].x=0, cube[0].y =0, cube[0].z=0, //Левая нижняя точка красная сторона.
  cube[1].x=0, cube[1].y =30, cube[1].z=0, //Левая верхняя точка красная сторона.
  cube[2].x=30, cube[2].y =30, cube[2].z=0, //Правая верхняя точка красная сторона.
  cube[3].x=30, cube[3].y =0, cube[3].z=0, //Правая нижняя точка красная сторона.
  cube[4].x=10, cube[4].y =10, cube[4].z=0, //Левая нижняя точка синяя сторона.
  cube[5].x=10, cube[5].y =40, cube[5].z=0, //Левая верхняя точка синяя сторона.
  cube[6].x=40, cube[6].y =40, cube[6].z=0, //Правая верхняя точка синяя сторона.
  cube[7].x=40, cube[7].y =10, cube[7].z=0  //Правая нижняя точка синяя сторона.
 };
 //drawPoints(paper, cube, VERTEX_SUM);
 while(!(operation == 'R')){
  paper.clear();                 
  operation = keyb.key_pressed();
  cubeScale(cube,operation,VERTEX_SUM);
  cubeMove(cube,operation,VERTEX_SUM);
  drawLine(paper, cube[4].x, cube[4].y, cube[5].x, cube[5].y, BLUE); //Синяя сторона.
  drawLine(paper, cube[5].x, cube[5].y, cube[6].x, cube[6].y, BLUE); //Синяя сторона.
  drawLine(paper, cube[6].x, cube[6].y, cube[7].x, cube[7].y, BLUE); //Синяя сторона.
  drawLine(paper, cube[7].x, cube[7].y, cube[4].x, cube[4].y, BLUE); //Синяя сторона.
  drawLine(paper, cube[0].x, cube[0].y, cube[4].x, cube[4].y, BLACK); //Чёрная сторона.
  drawLine(paper, cube[3].x, cube[3].y, cube[7].x, cube[7].y, BLACK); //Чёрная сторона.
  drawLine(paper, cube[1].x, cube[1].y, cube[5].x, cube[5].y, YELLOW); //Жёлтая сторона.
  drawLine(paper, cube[2].x, cube[2].y, cube[6].x, cube[6].y, YELLOW); //Жёлтая сторона.
  drawLine(paper, cube[0].x, cube[0].y, cube[1].x, cube[1].y, RED); //Красная сторона.
  drawLine(paper, cube[1].x, cube[1].y, cube[2].x, cube[2].y, RED); //Красная сторона.
  drawLine(paper, cube[2].x, cube[2].y, cube[3].x, cube[3].y, RED); //Красная сторона.
  drawLine(paper, cube[3].x, cube[3].y, cube[0].x, cube[0].y, RED); //Красная сторона.
  paper.display();
 }
}
void drawLine(playpen & paper,int x1, int y1, int x2, int y2, int const colour){
   int deltaX = abs(x2 - x1);
   int deltaY = abs(y2 - y1);
   int signX = x1 < x2 ? 1 : -1;
   int signY = y1 < y2 ? 1 : -1;
   int error = deltaX - deltaY;
   while(true) {
    paper.plot(x1, y1, colour);
    if(x1 == x2 && y1 == y2)
     break;
    int error2 = error * 2;
    if(error2 > -deltaY) {
     error -= deltaY;
     x1 += signX;
    }
    if(error2 < deltaX) {
     error += deltaX;
     y1 += signY;
    }
  }
}

void drawPoints(playpen & paper, point cubePoints[], int const VERTEX_SUM){
  for(int i; i<VERTEX_SUM;++i)
   paper.plot(cubePoints[i].x, cubePoints[i].y, 0);   
}
void cubeScale(point cubePoints[],char operation, int const VERTEX_SUM){
 switch(operation){
   case 'E':
     ++cubePoints[1].y;
     ++cubePoints[2].y;
     ++cubePoints[5].y;
     ++cubePoints[6].y;
   break;
   case 'Q':
     --cubePoints[1].y;
     --cubePoints[2].y;
     --cubePoints[5].y;
     --cubePoints[6].y;
   break;
   case 'X':
     ++cubePoints[3].x;
     ++cubePoints[2].x;
     ++cubePoints[6].x;
     ++cubePoints[7].x;
   break;
   case 'Z':
     --cubePoints[3].x;
     --cubePoints[2].x;
     --cubePoints[6].x;
     --cubePoints[7].x;
   break;
 }       
}

void cubeMove(point cubePoints[],char operation,int const VERTEX_SUM){
  switch(operation){
   case 'D':
    for(int i=0;i<VERTEX_SUM;++i){
     ++cubePoints[i].x;
    }
   break;
   case 'A':
    for(int i=0;i<VERTEX_SUM;++i){
     --cubePoints[i].x;
    }
   break;
   case 'W':
    for(int i=0;i<VERTEX_SUM;++i){
     ++cubePoints[i].y;
    }
   break;
   case 'S':
    for(int i=0;i<VERTEX_SUM;++i){
     --cubePoints[i].y;
    }
   break;
 }   
}

--- Конец кода ---

--- Цитата ---Таких знаний не нужно для хакинга, достаточно знать что такое камера и как работает, и что такое модели, и их иерархию, или ещё подобное...
--- Конец цитаты ---
Если знать как это работает то думаю повторить это будет не сложно. ;)

--- Цитата ---да и вообще, зачем тебе хакать графический движок? он же обычно такой огромный, что ты не осилишь. Лучше использовать готовые функции движка, а там особого ума не надо.
--- Конец цитаты ---
Чтобы использовать функции нужно о них что то знать. :(
r57shell:

--- Цитата: Mr2 от 17 Август 2011, 21:07:21 ---Не понял о чём ты.

--- Конец цитаты ---
А я модифицировал твой код... скомпилить не могу ибо у меня нет твоих двух библиотек, такчто помарки сам исправляй.

--- Код: ---// 17.08.2011 Cube.
// Author by Mr2.
// Modified by r57shell. added Z and optimized some stuf.
#include<iostream>
#include "playpen.h"
#include "keyboard.h"
#include <cmath>

using namespace std;
using namespace fgw;

struct point{
 int x;
 int y;
 int z;
};

point E[3];
point O;

void drawLine(playpen & paper,int x1, int y1, int x2, int y2, int const colour);
void drawPoints(playpen & paper, point cubePoints[], int const VERTEX_SUM);
void cubeScale(char operation);
void cubeMove(char operation);
void cubeRotate();
int main(){
 playpen paper;
 paper.scale(2);
 keyboard keyb; //Объект клавиотуры.
 int colour=0;
 char operation;
 const int RED=192, BLUE=15, GREEN=57, YELLOW=-39, PURPLE=68, BLACK=0;
 cout <<"  Qube by Mr2 " <<endl;
 cout <<"     v 0.1 " <<endl;
 cout <<"    Controll: " <<endl;
 cout <<"  Move: A D W S " <<endl;
 cout <<" Scale: E Q X Z " <<endl;
 cout <<"    Exit: R " <<endl;
 point verts[]={ //Распологаем точки по часовой стрелке начиная с левого нижнего.
  {0, 0, 0},
  {0, 1, 0},
  {1, 1, 0},
  {1, 0, 0},
  {0, 0, 1},
  {0, 1, 1},
  {1, 1, 1},
  {1, 0, 1},
 };
 int edges[]={
 0,1,
 1,2,
 2,3,
 3,0,
 4,5,
 5,6,
 6,7,
 7,0,
 0,4,
 1,5,
 2,6,
 3,7,
 };
 E[0].x=30;
 E[0].y=0;
 E[1].x=0;
 E[1].y=30;
 E[2].x=20;
 E[2].y=10;
 O.x=0;
 O.y=0;
 //drawPoints(paper, cube, VERTEX_SUM);
 while(!(operation == 'R')){
  paper.clear();                
  operation = keyb.key_pressed();
  cubeScale(operation);
  cubeMove(operation);
  int i;
  for (i=0;i<sizeof(edges)/sizeof(edges[0]);i+=2)
  {
point &x1=verts[edges[i]],
 &x2=verts[edges[i]];
point v1,v2;
v1.x=E[0].x*x1.x+E[1].x*x1.y+E[2].x*x1.z;
v1.y=E[0].y*x1.x+E[1].y*x1.y+E[2].y*x1.z;
v2.x=E[0].x*x2.x+E[1].x*x2.y+E[2].x*x2.z;
v2.y=E[0].y*x2.x+E[1].y*x2.y+E[2].y*x2.z;
drawLine(paper, v1.x, v1.y, v2.x, v2.y, BLUE);
  }
  paper.display();
 }
}
void drawLine(playpen & paper,int x1, int y1, int x2, int y2, int const colour){
   int deltaX = abs(x2 - x1);
   int deltaY = abs(y2 - y1);
   int signX = x1 < x2 ? 1 : -1;
   int signY = y1 < y2 ? 1 : -1;
   int error = deltaX - deltaY;
   while(true) {
    paper.plot(x1, y1, colour);
    if(x1 == x2 && y1 == y2)
     break;
    int error2 = error * 2;
    if(error2 > -deltaY) {
     error -= deltaY;
     x1 += signX;
    }
    if(error2 < deltaX) {
     error += deltaX;
     y1 += signY;
    }
  }
}

void drawPoints(playpen & paper, point cubePoints[], int const VERTEX_SUM){
  for(int i; i<VERTEX_SUM;++i)
   paper.plot(cubePoints[i].x, cubePoints[i].y, 0);  
}
void cubeScale(char operation){
 switch(operation){
   case 'E':
     ++E[1].y;
   break;
   case 'Q':
     --E[1].y;
   break;
   case 'X':
     ++E[0].x;
   break;
   case 'Z':
     --E[0].x;
   break;
 }        
}

void cubeMove(char operation){
  switch(operation){
   case 'D':
     ++O.x;
   break;
   case 'A':
     --O.x;
   break;
   case 'W':
     ++O.y;
   break;
   case 'S':
     --O.y;
   break;
 }  
}

--- Конец кода ---

--- Цитата: Mr2 от 17 Август 2011, 21:07:21 ---Если знать как это работает то думаю повторить это будет не сложно. ;)

--- Конец цитаты ---
Хоть я и знаю как работает - не разу пока полностью всё не делал сам... было один раз достаточно много сделано, да заброшено, ибо очень толсто.


--- Цитата: Mr2 от 17 Август 2011, 21:07:21 ---Чтобы использовать функции нужно о них что то знать. :(

--- Конец цитаты ---
Чтобы знать, достаточно оттестировать, или посмотреть применение, короче то, чем и занимается хацкер.
Mr2:

--- Цитата ---А я модифицировал твой код... скомпилить не могу ибо у меня нет твоих двух библиотек, такчто помарки сам исправляй.
--- Конец цитаты ---
Чё то я не понял? :?
А где эффект, вроде работает также.
Неплохо было ещё откоментировать :

--- Код: ---point E[3];
point O;
v1.x=E[0].x*x1.x+E[1].x*x1.y+E[2].x*x1.z;

--- Конец кода ---


--- Цитата ---Хоть я и знаю как работает - не разу пока полностью всё не делал сам...
--- Конец цитаты ---
Человеком движит интерес. Всегда интересно применять знания.

--- Цитата ---было один раз достаточно много сделано, да заброшено, ибо очень толсто.
--- Конец цитаты ---
Ну заброшено, это не удалено.Можно и вернуться. :)

--- Цитата ---Чтобы знать, достаточно оттестировать, или посмотреть применение, короче то, чем и занимается хацкер.
--- Конец цитаты ---
Мне намного проще сделать самому, а потом уже искать аналогии у других. А так откроешь, и не знаешь за что браться. ;)

Добавлено позже:
Добаил какую то фигню, выглядит как поворот.Похоже на псевдо 3D. :D
Cube0.2
r57shell:

--- Цитата: Mr2 от 17 Август 2011, 23:59:16 ---Неплохо было ещё откоментировать :

--- Код: ---point E[3];
point O;
v1.x=E[0].x*x1.x+E[1].x*x1.y+E[2].x*x1.z;

--- Конец кода ---

--- Конец цитаты ---
просто кто-то плохо читает, что ему пишут

--- Цитата: r57shell от 17 Август 2011, 16:41:08 ---выбираешь 3 вектора i,j,k=(x,y) на плоскости экрана. И выбираешь точку O=(x,y) тоже на плоскости экрана.
после чего рисуешь модель основываясь на том что если нужно X=(x,y,z) спроецировать на экран, и P=(x,y) - проекция, то P=X.x*i+X.y*j+X.z*k.

--- Конец цитаты ---
Если всё ещё не понятно, то проведи соответствие E[0]=i, E[1]=j, E[2]=k, O=O. смайлег типа  :lol:
На самом деле всё просто как 2х2 (дважды два). i - это направление в котором движимся по x, j - направление y, k - направление z, и O - точка отсчёта. И всё это указывается в 2D.
Mr2:

--- Цитата: r57shell от 18 Август 2011, 00:58:49 ---просто кто-то плохо читает, что ему пишут
--- Конец цитаты ---
Да нет, я просто ничего не понял там.

--- Цитата: r57shell от 18 Август 2011, 00:58:49 ---Если всё ещё не понятно, то проведи соответствие E[0]=i, E[1]=j, E[2]=k, O=O. смайлег типа  :lol:
На самом деле всё просто как 2х2 (дважды два). i - это направление в котором движимся по x, j - направление y, k - направление z, и O - точка отсчёта.

--- Конец цитаты ---
Будем разбираться.

--- Цитата ---И всё это указывается в 2D.
--- Конец цитаты ---
А в чём преимущество если указывать в 3D.

-----------
Усилил эффект поворота. Может скоро и повернуть смогу! :)
r57shell:
вот пинок для старта :lol:
http://www.emu-land.net/forum/index.php/topic,39461.0.html
дальше разбирайся сам. например в доках по DirectX описано как всё работает. в OpenGL наверно тоже... не факт.
Mr2:
Проанализировал код.Вот что выяснил:

--- Код: ---//умножение на один даст то же число.Непонятно участие данной структуры.
point verts[]={
  {0, 0, 0},
  {0, 1, 0},
  {1, 1, 0},
  {1, 0, 0},
  {0, 0, 1},
  {0, 1, 1},
  {1, 1, 1},
  {1, 0, 1},
 };
 

//Не участвует в коде.
O.x=0;
O.y=0;

//Значения равны между собой v1.x == v2.x, v1.y == v2.y. Зачем?
v1.x= E[0].x * x1.x + E[1].x * x1.y + E[2].x * x1.z;
v1.y= E[0].y * x1.x + E[1].y * x1.y + E[2].y * x1.z;
v2.x= E[0].x * x2.x + E[1].x * x2.y + E[2].x * x2.z;
v2.y= E[0].y * x2.x + E[1].y * x2.y + E[2].y * x2.z;

--- Конец кода ---
r57shell:
вот тебе наглядный рисунок.
Большинство так в школах рисуют 3D объекты.
в системе координат экрана: x,y.
делаем вектора x,y,z которые разноцветные заисключением Z.
эти вектора задаются в 2D а позволяют рисовать в 3D.
основываясь на стандартных принципах ортогональных систем координат,
координата Z может получится если спроецировать вектор исходный (O) на ортогональное дополнение к Z, то есть на плоскость OXY,
вторая составляющая проекции (не помню как она называется, короче которая не проекция), и будет координата Z
аналогично X,Y,Z
координаты X,Y,Z обозначены как рёбра куба. Почему куб получается- потому, что не важно в каком порядке точку проэцировать, всё равно
получатся одинаковые координаты.
Я что и делаю. Мне нужно нарисовать O, я умножаю его X координату на вектор X, потом Y координату на вектор Y, и так далее. всё это суммирую - получаю точку на плоскости.
Xx - x координата X вектора, Xy - у координата X вектора, Yx - x координата Y вектора, Yy - y координата Y вектора...
E[0],E[1],E[2] в программе - в каком-то порядке X,Y,Z вектора, которые логично состоят из x,y координат. Лень было создавать структуру на x,y точки, так что воспользовался x,y,z структурой.

point verts[] - координаты вершин куба.
O.x, O.y - точка отсчёта. Да, забыл заюзать. К v1.x, v2.x надо прибавить O.x, v1.y,v2.y надо прибавить O.y

выше уже это описывал, читай внимательнее, тут даже видишь рисунок нарисовал.
увы я не художник такчто...
Mr2:
Я тут почитал, про изометрию. :blush:
Ты мне об этом пытался сказать?

--- Цитата ---Основываясь на инженерном техническом черчении, изометрическое изображение представляет объекты без учета перспективы. Объекты базируются на решетке ромбовидной формы, как показано ниже.



--- Конец цитаты ---
r57shell:
не совсем, изометрия, это скорее аксонометрическая проекция.
Mr2:

--- Цитата: r57shell от 25 Сентябрь 2011, 20:31:24 ---не совсем, изометрия, это скорее аксонометрическая проекция.

--- Конец цитаты ---

--- Цитата ---Изометри́ческая прое́кция — это разновидность аксонометрической проекции,
--- Конец цитаты ---
Что то ты меня совсем запутал. :?
Я хотел сделать вот так:
Имеем обзор XY, Z не видна(рисунок 1) видим соответственно одну сторону куба, поворачиваем его по горизонтали(рисунок 2)  и видим две стороны.
Ты предлогаешь как я понял изменить обзор и отобразить куб с учётом этого обзора(рисунок 3).То есть изменяем направления Z координаты, соответственно становятся видны другие стороны куба.Так?
r57shell:
не неси хрень. я ничего нигде не вращяю, я просто отображаю в соответствии с правилом: перемещение по x = перемещению по вектору X, аналогично остальные координаты.
код который выше я выкладывал позволяет проецировать 3D объекты в любую аксонометрическую проекцию, в том числе и в изометрию
для совсем тупых: дятел - разновидность птицы.
аналогично изометрия - разновидность аксонометрической проекции.
Mr2:

--- Цитата: r57shell от 26 Сентябрь 2011, 11:16:15 ---не неси хрень. я ничего нигде не вращяю, я просто отображаю в соответствии с правилом: перемещение по x = перемещению по вектору X, аналогично остальные координаты.
--- Конец цитаты ---
Я про то и говорю. Что ты не вращяешь, а меняешь угол обзора изменив направления Z оси(если раньше она была не видна то у тебя вполне видна), и при этом становятся видны другие стороны куба, как на третьем рисунке. Я же хотел повернуть куб и отобразить не меняя угла обзора(при котором Z координата не видна).Рисунок 1 исходное положение, 2 повёрнутый куб.

--- Цитата: r57shell от 26 Сентябрь 2011, 11:16:15 ---для совсем тупых: дятел - разновидность птицы.
аналогично изометрия - разновидность аксонометрической проекции.

--- Конец цитаты ---
Не логично:

--- Цитата ---не совсем, изометрия, это скорее аксонометрическая проекция.
--- Конец цитаты ---
Не совсем, дятел, это скорее птица летающяя. :lol: :lol: :lol:
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии