Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Движок на пальцах "От" и "До", Часть #1 
:(
    Опции темы
Rickert
Дата 19.10.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



Цитата
Итак, мы начинаем балл!

Сегодня мы поработаем над парой базовых классов для нашего проекта. А именно:
  • Класс  строки
  • Вектора
  • Двусвязанного списка
Сразу хочется сказать, что файлы реализации (*.cpp) мы будем ложить в директорию "cpp", а файлы описания в "inc", обе папки лежат в одной директории.
Я советую вам создать пустой “win32 console” проект и в нём время от времени дебажить некие маленькие алгоритмы. В частности, сейчас будем писать класc  строки.
Называйте, как хотите, а у меня это класс “aString”. Что должен будет уметь наш класс?
  •  Хранить данные как в wchar_t, так и char
  •  Складывать две строки
  •  Сравнивать две строки
  •  Искать строку до опред. символа
  •  Искать строку после опред. символа
Итак содаём файл описания класса (astring.h):
Код
//=============================================================================

#ifndef ASTRING_H
  #define ASTRING_H

//=============================================================================

#include <windows.h>

//=============================================================================

class aString
{
  public:
    aString();//конструктор всех видов
    aString(const wchar_t* str);
    aString(const char* str);
    aString(const aString& str);

    inline size_t asGetLength()const          {return m_Length;}
    inline const wchar_t* asGetString()const  {return m_pData;}
    inline const char* asGetStringChar()const {return m_pCharData;}
    inline UINT asGetCodePage()const          {return codePage;}
    inline size_t asGetCharSize()const        {return charSize;}

    bool operator==(const aString& str);
    bool operator==(const wchar_t* str);
    bool operator==(const char* str);
    bool operator!=(const aString& str);
    bool operator!=(const wchar_t* str);
    bool operator!=(const char* str);
    const aString operator=(const aString& str);
    const aString operator=(const wchar_t* str);
    const aString operator=(const char* str);
    const aString operator+=(const aString str);
    const aString operator+=(const wchar_t* str);
    const aString operator+=(wchar_t chr);

    aString asFindBefore(wchar_t chr, bool include);//вернуть строку до опред. символа
    aString asFindAfter(wchar_t chr, bool include);//вернуть строку после опред. символа
    void asClear();//отчистить строку

    ~aString();

  private:
    size_t m_Length;
    wchar_t* m_pData;
    char* m_pCharData;
    const size_t charSize;
    UINT codePage;
    UINT codePageW;
};

//=============================================================================

#endif

//=============================================================================

Вообщем – то здесь всё прозрачно и ясно. Конкретная реализация идёт дальше: тут вам придётся поработать самим в некоторых местах.
astring.cpp
Код
//=============================================================================

#include <string.h>
#include "../inc/aString.h"

//=============================================================================

aString::aString() : charSize(sizeof(wchar_t))//частенько используется размер wchar_t: думаю логично было бы его зафиксировать. Char = 1
{
  m_Length = 0;
  m_pData = 0;
  m_pCharData = 0;
  codePage = CP_UTF8;//код для преобразования из wchar_t в char
  codePageW = CP_UTF8;//наоборот
}

//=============================================================================

aString::aString(const wchar_t* str) : charSize(sizeof(wchar_t))
{
  m_Length = 0;
  m_pData = 0;
  m_pCharData = 0;
  codePage = CP_UTF8;
  codePageW = CP_UTF8;

  if (!str)
    return;

  size_t strLen = wcslen(str);
  
  m_pData = new wchar_t[strLen + 1];
  m_pCharData = new char[strLen + 1];
  memcpy(m_pData, str, strLen*charSize);
  m_pData[strLen] = 0;

  //здесь должна быть функция преобразования wchar_t в char. Покумекайте сами, найдите описание и научитесь использовать. Все данные у вас есть.

  m_pCharData[strLen] = 0;

  m_Length = strLen;
}

//=============================================================================

aString::aString(const char* str) : charSize(sizeof(wchar_t))
{
  m_Length = 0;
  m_pData = 0;
  m_pCharData = 0;
  codePage = CP_UTF8;
  codePageW = CP_UTF8;

  if (!str)
    return;

  size_t strLen = strlen(str);
  
  m_pData = new wchar_t[strLen + 1];
  m_pCharData = new char[strLen + 1];
  memcpy(m_pCharData, str, strLen);
  m_pCharData[strLen] = 0;

  //здесь должна быть функция преобразования char в wchar_t. Покумекайте сами, найдите описание и научитесь использовать. Все данные у вас есть.

  m_pData[strLen] = 0;

  m_Length = strLen;
}

//=============================================================================

aString::aString(const aString& str) : charSize(sizeof(wchar_t))
{
  m_Length = 0;
  m_pData = 0;
  m_pCharData = 0;
  codePage = CP_UTF8;
  codePageW = CP_UTF8;

  if (str.asGetLength() <= 0)
    return;

  const wchar_t* tmpPointer = str.asGetString();
  size_t strLen = wcslen(tmpPointer);
  
  m_pData = new wchar_t[strLen + 1];
  m_pCharData = new char[strLen + 1];
  memcpy(m_pData, tmpPointer, strLen*charSize);
  m_pData[strLen] = 0;

  //здесь должна быть функция преобразования wchar_t в char. Покумекайте сами, найдите описание и научитес использовать. Все данные у вас есть.

  m_pCharData[strLen] = 0;

  m_Length = strLen;
}

//=============================================================================

bool aString::operator==(const aString& str)
{
  if (str.asGetLength() != m_Length)
    return 0;

  wchar_t* tmpPointer = m_pData;
  const wchar_t* tmpPointer2 = str.asGetString();
  
  while(*tmpPointer != L'\0')
  {
    if (*tmpPointer++ != *tmpPointer2++)
      return 0;
  }

  return 1;
}

//=============================================================================

bool aString::operator==(const wchar_t* str)
{
  if (!str)
    return 0;

  if (wcslen(str) != m_Length)
    return 0;

  wchar_t* tmpPointer = m_pData;
  
  while(*tmpPointer != L'\0')
  {
    if (*tmpPointer++ != *str++)
      return 0;
  }

  return 1;
}


//=============================================================================

bool aString::operator==(const char* str)
{
  if (!str || !m_pCharData)
    return 0;

  if (strlen(str) != m_Length)
    return 0;

  char* tmpPointer = m_pCharData;
  
  while(*tmpPointer != L'\0')
  {
    if (*tmpPointer++ != *str++)
      return 0;
  }

  return 1;
}

//=============================================================================

bool aString::operator!=(const aString& str)
{
  if (str.asGetLength() != m_Length)
    return 1;

  wchar_t* tmpPointer = m_pData;
  const wchar_t* tmpPointer2 = str.asGetString();
  
  while(*tmpPointer != L'\0')
  {
    if (*tmpPointer++ != *tmpPointer2++)
      return 1;
  }

  return 0;
}

//=============================================================================

bool aString::operator!=(const wchar_t* str)
{
  if (!str)
    return 1;

  if (wcslen(str) != m_Length)
    return 1;

  wchar_t* tmpPointer = m_pData;
  const wchar_t* tmpPointer2 = str;
  
  while(*tmpPointer != L'\0')
  {
    if (*tmpPointer++ != *tmpPointer2++)
      return 1;
  }

  return 0;
}

//=============================================================================

bool aString::operator!=(const char* str)
{
  if (!str)
    return 1;

  if (strlen(str) != m_Length)
    return 1;

  wchar_t* tmpPointer = m_pData;
  
  while(*tmpPointer != L'\0')
  {
    if (*tmpPointer++ != *str++)
      return 1;
  }

  return 0;
}

//=============================================================================

const aString aString::operator=(const aString& str)
{
  if (str.asGetLength() <= 0)
    return (*this);

  const wchar_t* tmpPointer = str.asGetString();
  size_t strLen = wcslen(tmpPointer);
  
  m_pData = new wchar_t[strLen + 1];
  m_pCharData = new char[strLen + 1];
  memcpy(m_pData, tmpPointer, strLen*charSize);
  m_pData[strLen] = 0;

  //здесь должна быть функция преобразования wchar_t в char. Покумекайте сами, найдите описание и научитесь использовать. Все данные у вас есть.

  m_pCharData[strLen] = 0;

  m_Length = strLen;

  return (*this);
}

//=============================================================================

const aString aString::operator=(const wchar_t* str)
{
  if (!str)
    return (*this);

  size_t strLen = wcslen(str);
  
  m_pData = new wchar_t[strLen + 1];
  m_pCharData = new char[strLen + 1];
  memcpy(m_pData, str, strLen*charSize);
  m_pData[strLen] = 0;

  //здесь должна быть функция преобразования wchar_t в char. Покумекайте сами, найдите описание и научитесь использовать. Все данные у вас есть.

  m_pCharData[strLen] = 0;

  m_Length = strLen;

  return (*this);
}

//=============================================================================

const aString aString::operator=(const char* str)
{
  if (!str)
    return (*this);

  size_t strLen = strlen(str);
  
  m_pData = new wchar_t[strLen + 1];
  m_pCharData = new char[strLen + 1];
  memcpy(m_pCharData, str, strLen);
  m_pData[strLen] = 0;

  //здесь должна быть функция преобразования char в wchar_t. Покумекайте сами, найдите описание и научитесь использовать. Все данные у вас есть.

  m_Length = strLen;

  return (*this);
}

//=============================================================================

const aString aString::operator+=(const aString str)
{
  if (str.asGetLength() <= 0)
    return (*this);

  size_t newLength = str.asGetLength() + m_Length;
  wchar_t* newData = new wchar_t[newLength + 1];
  char* newData2 = new char[newLength + 1];

  memcpy(newData, m_pData, m_Length*charSize);
  memcpy(&newData[m_Length], str.asGetString(), str.asGetLength()*charSize);
  newData[newLength] = 0;
  
  delete [] m_pData;
  delete [] m_pCharData;

  //здесь должна быть функция преобразования wchar_t в char. Покумекайте сами, найдите описание и научитесь использовать. Все данные у вас есть.

  newData2[newLength] = 0;

  m_pData = newData;
  m_pCharData = newData2;
  m_Length = newLength;

  return (*this);
}

//=============================================================================

const aString aString::operator+=(const wchar_t* str)
{
  if (!str)
    return (*this);

  size_t tmpLength = wcslen(str);

  if (tmpLength <= 0)
    return (*this);

  size_t newLength = tmpLength + m_Length;
  wchar_t* newData = new wchar_t[newLength + 1];
  char* newData2 = new char[newLength + 1];

  memcpy(newData, m_pData, m_Length*charSize);
  memcpy(&newData[m_Length], str, tmpLength*charSize);
  newData[newLength] = 0;
  
  delete [] m_pData;
  delete [] m_pCharData;

  //здесь должна быть функция преобразования wchar_t в char. Покумекайте сами, найдите описание и научитесь использовать. Все данные у вас есть.

  newData2[newLength] = 0;

  m_pData = newData;
  m_pCharData = newData2;
  m_Length = newLength;

  return (*this);
}

//=============================================================================

const aString aString::operator+=(wchar_t str)
{
  size_t newLength = m_Length + 1;
  wchar_t* newData = new wchar_t[newLength + 1];

  memcpy(newData, m_pData, m_Length*charSize);
  memcpy(&newData[m_Length], &str, charSize);
  newData[newLength] = 0;
  
  if (m_Length > 0)
    delete [] m_pData;

  m_pData = newData;
  m_Length = newLength;

  return (*this);
}

//=============================================================================

aString aString::asFindBefore(wchar_t chr, bool include)
{
  wchar_t* tmpPointer = m_pData;
  aString res;

  while(*tmpPointer != L'\0')
  {
    if (*tmpPointer != chr)
      res += *tmpPointer++;
    else
    {
      if (include)
        res += *tmpPointer;

      break;
    }
  }

  return res;
}

//=============================================================================

aString aString::asFindAfter(wchar_t chr, bool include)
{
  wchar_t* tmpPointer = m_pData;
  aString res;
  bool find = 0;

  while(*tmpPointer != L'\0')
  {
    if ((*tmpPointer == chr) && (!find))
    {
      find = 1;
      if (!include)
      {
        ++tmpPointer;

        continue;
      }
    }

    if (find)
      res += *tmpPointer;

    ++tmpPointer;
  }

  return res;
}

//=============================================================================

void aString::asClear()
{
  if (m_pData)
  {
    delete [] m_pData;

    m_pData = 0;
  }
  if (m_pCharData)
  {
    delete [] m_pCharData;

    m_pCharData = 0;
  }
  m_Length = 0;
}

//=============================================================================

aString::~aString()
{
  asClear();
}

//=============================================================================

Получается, что в первой нашей части теории практической никакой нет: просто отрабатываем общие принципы создания классов и включаем воображалку.
Идём дальше. Двусвязанный список
Он состоит из одного файла описания, потому что будет основан на шаблонах.
aList.h
Код
//==============================================================================

#ifndef ALIST_H
  #define ALIST_H

//==============================================================================

template <class TypeItem> class aItem
{
  public:
    aItem<TypeItem>()
    {
      next = 0;
      prev = 0;
    };
    ~aItem<TypeItem>()
    {
    };
    
    aItem* next;
    aItem* prev;
    TypeItem data;
};//класс – элемент нашего списка.

//==============================================================================

template <class Type> class aList
{
  public:
    inline aItem<Type>* alGetLastItem() const     {return last;}
    inline aItem<Type>* alGetFirstItem() const    {return items;}
    inline int alGetCount() const                 {return count;}

    aList()
    {
      items = 0;
      last = 0;
      count = 0;
    }
    ~aList()
    {
      alRemoveItems();
    }

    aItem<Type>* alAddItem()
    {
      if (!items)
      {
        items = new aItem<Type>;
        last = items;
        ++count;
    
        return items;
      }
  
      aItem<Type>* tmpItem = this->alGetLastItem();

      tmpItem->next = new aItem<Type>;
      tmpItem->next->prev = tmpItem;

      last = tmpItem->next;
      ++count;
  
      return last;
    }
    void alRemoveItems()
    {
      if (!items)
        return;

      aItem<Type>* tmpItem = alGetLastItem();
      aItem<Type>* tmpItem2 = 0;
  
      while(1)
      {
        tmpItem2 = tmpItem->prev;
    
        delete tmpItem;
    
        if (tmpItem2)
          tmpItem = tmpItem2;
        else
          break;
      }
      items = 0;
      last = 0;
      count = 0;
    }
    void alRemoveLastItem()
    {
      if (items)
      {
        if (last->prev)
        {
          last->prev = 0;

          delete last;
        }
        else
        {
          delete items;
          
          items = 0;
        }
        last = 0;
        --count;
      }
    }
    void alRemoveItem(aItem<Type>* it)
    {
      //а вот тут помучайтесь и напиши функцию, которая будет удалять любой элемент нашего списка. Не забывайте про исключительные ситуации и проверить находится ли этот элемент вообще в нашем списке.
    }
    
  private:
    bool alFoundItem(aItem<Type>* it)//функция проверяет: есть ли такой объект в нашем списке.
    {
      //тоже подумайте как написать
    }

  private:
    aItem<Type>* items;
    aItem<Type>* last;
    int count;
};

//==============================================================================

#endif

//==============================================================================

Помните: чем больше исключений вы обработаете и отбросите – тем стабильнее будет ваш код. В идеале, программист должен уметь предусмотреть абсолютно все варианты, которые могут привести к крушению приложения.
Дальше, по программе – чай с сахаром, а затем маленький класс вектора, который будет использован для больших деяний ;-)
avector.h
Код
//=============================================================================

#ifndef AVECTOR_H
  #define AVECTOR_H

//=============================================================================

#include <math.h>

//=============================================================================

class aVector
{
  public:
      inline const aVector& operator=(const aVector& vec)
      {
        this->x = vec.x;
        this->y = vec.y;
        this->z = vec.z;

        return (*this);
      }
      inline bool operator==(const aVector& vec)
      {}//реализуйте самостоятельно сравнение двух векторов. Помните что напрямую сравнить два float числа вы не можете: работа над числами с плавующей точкой весьма бажна. Шустри гуглом, думайте: это не сложно.
      inline bool operator==(const aVector& vec)const
      {}
      inline bool operator!=(const aVector& vec)
      {}
      inline bool operator!=(const aVector& vec)const
      {}
      inline const aVector operator+(const aVector& vec)const
      {
        aVector tmpVector((*this));

        tmpVector.x += vec.x;
        tmpVector.y += vec.y;
        tmpVector.z += vec.z;

        return tmpVector;
      }
      inline const aVector operator-(const aVector& vec)const
      {
        aVector tmpVector((*this));

        tmpVector.x -= vec.x;
        tmpVector.y -= vec.y;
        tmpVector.z -= vec.z;

        return tmpVector;
      }
      inline const aVector operator+=(const aVector& vec)
      {
        this->x += vec.x;
        this->y += vec.y;
        this->z += vec.z;

        return (*this);
      }
      inline const aVector operator-=(const aVector& vec)
      {
        this->x -= vec.x;
        this->y -= vec.y;
        this->z -= vec.z;

        return (*this);
      }
      inline const aVector operator*(float num)const
      {
        aVector tmpVector((*this));

        tmpVector.x *= num;
        tmpVector.y *= num;
        tmpVector.z *= num;

        return tmpVector;
      }
      inline const aVector operator/(float num)const
      {
        aVector tmpVector((*this));

        tmpVector.x /= num;
        tmpVector.y /= num;
        tmpVector.z /= num;

        return tmpVector;
      }
      inline const aVector operator*=(float num)
      {
        this->x *= num;
        this->y *= num;
        this->z *= num;

        return (*this);
      }
      inline const aVector operator/=(float num)
      {
        this->x /= num;
        this->y /= num;
        this->z /= num;

        return (*this);
      }

    aVector();
    aVector(float, float, float);
    aVector(const aVector&);
      void avSet(float, float, float);
    ~aVector();

  public:
    float x, y, z;
};

//=============================================================================

#endif

//=============================================================================

Ну и файл реализации (avector.cpp):
Код
//=============================================================================

#include "../inc/aVector.h"

//=============================================================================

aVector::aVector()
{
  this->x = 0;
  this->y = 0;
  this->z = 0;
}

//=============================================================================

aVector::aVector(float xx, float yy, float zz)
{
  this->x = xx;
  this->y = yy;
  this->z = zz;
}

//=============================================================================

aVector::aVector(const aVector& vec)
{
  this->x = vec.x;
  this->y = vec.y;
  this->z = vec.z;
}

//=============================================================================

void aVector::avSet(float xx, float yy, float zz)
{
  this->x = xx;
  this->y = yy;
  this->z = zz;
}

//=============================================================================

aVector::~aVector()
{
}

//=============================================================================

Слов и аналитики мало, потому что тут голые и незамороченные факты.
Спрашивайте, пишите, подскажу, если что ;-)

Да прибудет с вами великая сила!

Добавлено @ 15:11
Поиграйтесь с классами, поищите баги у меня в коде, предложите свои улучшения, научитесь всем пользоваться: вы большие мальчики/девочки - сможете.

Это сообщение отредактировал(а) Rickert - 20.10.2008, 03:45


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
AntonN
Дата 19.10.2008, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: нет
Всего: 18



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



--------------------
user posted image
PM MAIL WWW   Вверх
Lazin
Дата 19.10.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



для чего нужны строки, или списки? ну и тем более совсем непонятно для чего в графическом движке может пригодится класс вектор smile 
для танкистов: это была ирония
PM MAIL Skype GTalk   Вверх
AntonN
Дата 19.10.2008, 22:56 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: нет
Всего: 18



Lazin, хоть и ирония - выскажусь smile
Не списки - а двусвязные списки. И почему списки (и разница в односвязном и двусвязном), а не массивы, чем отличаются, что где лучше применять.
Зачем нужен вектор, что это вообще такое. Почему нет примера его использования (это ведь "на пальцах" "От и До") smile
Да и про "графический" ничего не сказано.

PS Автор сам сказал "спрашивайте, пишите" smile

Это сообщение отредактировал(а) AntonN - 19.10.2008, 22:57


--------------------
user posted image
PM MAIL WWW   Вверх
Lazin
Дата 19.10.2008, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



Цитата(AntonN @  19.10.2008,  22:56 Найти цитируемый пост)
Зачем нужен вектор, что это вообще такое

это точка, в 3-х мерном пространстве(разве названия переменных - x, y, z не вызвали поозрений?), правда у Rickert-а он реализован неканоничъно smile 
PM MAIL Skype GTalk   Вверх
AntonN
Дата 19.10.2008, 23:40 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: нет
Всего: 18



Lazin, не обязательно в трехмерном. Я знаю что такое вектор (в контексте геймдевелопмента), я про то, что в статье "движок на пальцах От и До" ожидалось объяснения, что такое вектор и чем он лучше хотя бы "обычных" переменных углов и значения скорости, и хотя бы внятный пример использования.


--------------------
user posted image
PM MAIL WWW   Вверх
Rickert
Дата 20.10.2008, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



  • Если человек не знает что такое вектор и аналитическая геометрия - ему нечего делать в компьютерной графике. Пусть сначала получит хотя бы среднее образование.
  • Извините, но я не собираюсь устраивать дошкольный кружок, а предполагаю, что человек уже знаком с C++. Как уже говорил в своей "нулевой" статьей: часть материала я буду умышленно оставлять на размышлении читателя - чтобы шевелил мозгами. Это не детский сад, где вам будут ложить в рот кашу. Моей главной задачей стоит хорошо объяснить структуру движка и основные алгоритмы типа скелетной анимации и прочего. А элементарщину и вопросы типа "а зачем строка/списка, если есть stl?" - оставьте для холиваров.
  • Смысла вопроса "а зачем нужны векторы?" вообще не понимаю.
  • Думаю куда главнее читателю будет понять геометрический смысл перемножения матриц на векторы, в скелетной анимации, или понять почему же всё-таки жёсткое ограничение на кол-во fps - это путь для настоящих джедаев и ценителлей честных правил игры.
Цитата(Lazin @  19.10.2008,  23:33 Найти цитируемый пост)
это точка, в 3-х мерном пространстве(разве названия переменных - x, y, z не вызвали поозрений?), правда у Rickert-а он реализован неканоничъно

Неканонично - это как? smile

Цитата(AntonN @  19.10.2008,  23:40 Найти цитируемый пост)
Lazin, не обязательно в трехмерном. Я знаю что такое вектор (в контексте геймдевелопмента), я про то, что в статье "движок на пальцах От и До" ожидалось объяснения, что такое вектор и чем он лучше хотя бы "обычных" переменных углов и значения скорости, и хотя бы внятный пример использования. 

Что значит "в контексте геймдевелопмента"? Что в контексте стереометрии или анал. геом. вектор - другое существо?

Это сообщение отредактировал(а) Rickert - 20.10.2008, 04:25


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Lazin
Дата 20.10.2008, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



Цитата(Rickert @  20.10.2008,  03:41 Найти цитируемый пост)
Неканонично - это как?

Обычно, для преобразования координат используют матрицы, для двухмерного случая, сам вектор должен быть 3х мерным
|x, y, 1|'  а матрица описывающая преобразования ад ним должна быть размерности 3х3, в этом случае любое преобразование над координатами можно получить умножением вектора на соответствующую матрицу, помимо этого такие матрицы можно перемножать, это очень удобно, так как не нужно писать ф-ю поворачивающую вектор на нужный угол, ф-ю смещающую по х и по у и тд.. к тому-же если действий много, достаточно просто перемножить матрицы которыми эти действия описываются, а потом с помощью полученой матрицы преобразовать координаты вершин
http://www.compgraphics.info/3D/3d_definitions.php
PM MAIL Skype GTalk   Вверх
Rickert
Дата 20.10.2008, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



Lazin, и как это связано с нашим классом вектора? В чём неканоничность - я слова этого понять не могу?
Да, для преобразований большенство использует умножение на матрицу (кстати не понимая что происходит с геометрической точки зрения), но что нам мешает применить матрицу к нашему вектору?
Я это проделываю, и мы будем это проделывать без каких - либо проблем.

Это сообщение отредактировал(а) Rickert - 20.10.2008, 08:27


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Lazin
Дата 20.10.2008, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



Цитата(Rickert @  20.10.2008,  08:26 Найти цитируемый пост)
В чём неканоничность - я слова этого понять не могу?

мне это слово нравится smile 
просто в этом классе нет метода для умножения на матрицу, что не очень удобно, вот поэтому я так и сказал...
PM MAIL Skype GTalk   Вверх
Rickert
Дата 20.10.2008, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
noKEmoH
Дата 30.10.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



Если движок уже существует и находится в режиме отладки или оптимизации то, ничего...

а если он на стадии разработки то я бы предложил в векторе место x y z использовать массив на 3 элемента, тогда не возникнет проблем прохождения массива векторов указателями.

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


Это сообщение отредактировал(а) noKEmoH - 31.10.2008, 01:34
PM MAIL   Вверх
Rickert
Дата 31.10.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



Цитата(noKEmoH @  30.10.2008,  23:14 Найти цитируемый пост)
а если он на стадии разработки то я бы предложил в векторе место x y z использовать массив на 3 элемента, тогда не возникнет проблем прохождения массива векторов указателями.

А зачем и чем это лучше?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
noKEmoH
Дата 1.11.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



у меня массив структур
Код

struct vect
{
  int x,y,z;
};
vect v_mas[3];

неполучилось связать с функциями glVertexPointer ... glDrawElements, а 
Код

struct vect
{
  int m[3];
};

заработало без проблем
PM MAIL   Вверх
Rickert
Дата 1.11.2008, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



noKEmoH, а зачем его связывать? Модель (то что ты отображаешь), по определению состоит из вершин, а не векторов. Мухи - отдельно, котлеты - отдельно.

Это сообщение отредактировал(а) Rickert - 1.11.2008, 12:12


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
noKEmoH
Дата 1.11.2008, 15:32 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



ну у меня векторы и вершины используют одну структуру основной элемент которой m[3]; Хотя можно и написать для вершин и векторов отдельные классы.
PM MAIL   Вверх
Rickert
Дата 1.11.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



noKEmoH, это значит ты неправильно архитектуру строишь. Всё должно быть логично, ибо программирование - это логика в чистом виде.
Не надо никаких классов вершин. Просто когда ты будешь делать класс модели, заводи указатель на тип float и пиши в память вершины.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
mr.DUDA
Дата 5.11.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Хорошее начинание, годится для написания небольшого трактата на тему "сферический конь в вакууме".

Можно присоединиться?  smile 

Движок "сферический конь в вакууме (СКВВ) для DirectX":
1. СКВВ состоит из основных подсистем: графика, физика, игровая логика (AI если угодно), звук, работа с данными (загрузка-выгрузка ресурсов). Рассматриваем только графику, остальное пока отбросим.

2. Графическая подсистема функционально представляет собой бесконечный цикл, в котором отрисовывается кадр. Структурно это набор классов, где присутствуют следующие основные понятия:
  • рендерер - управляет циклом отрисовки, обрабатывает события графического устройства
  • 3D объект - всё что нужно для описания одного 3D-объекта в сцене, содержит ссылки на материал, геометрию и параметры (размер, позиция и ориентация в пространстве, др. параметры)
  • источник света - подвид 3D объекта, не отрисовывается сам по себе, указывает параметры освещения (диффуз, спекуляр)
  • камера - подвид 3D объекта, не отрисовывается сам по себе, указывает точку и направление обзора, FOV и aspect ratio
  • сцена - плоский список или иерархия 3D объектов
  • материал - описывает, как рендерить 3D объект, хранит список текстур, рендер стейтов и D3DXEffect либо отдельную пару шейдеров
  • геометрия - описывает, что рендерить для отрисовки 3D объекта, хранит один и более вершинных буферов, один необязательный индексный буфер, необязательные смещения и размеры в них и тип примитивов
3. Игровой цикл представляет собой следующую последовательность действий. 
Для каждого 3D объекта в сцене рендерер выполняет:
  • вычисляет матрицу преобразования в мировые координаты (или пропускает, если она с прошлого раза не менялась)
  • вычисляет bounding box объекта по его размерам и/или крайним точкам в вершинном буфере, с учётом мировой матрицы
  • проверяет, пересекается или попадает ли bounding box в поле зрения камеры (frustrum culling), если нет то пропускаем этот объект
  • определяет какие источники света воздействуют на 3D объект (по расстоянию от объекта до лампочки или конусу spotlight)
  • по настройкам материала выставляет рендер стейты, текстуры и шейдеры/эффект на девайс
  • по состоянию объекта и параметрам материала настраивает параметры шейдеров/эффекта
  • по настройкам геометрии выставляет вершинные и индексный буфер на девайс
  • выполняет отрисовку (так называемый DIP - Draw Indexed Primitive или Draw User Primitive или др. вариант метода граф. девайса)
4. От общих понятий перейдём к частным, и рассмотрим самые элементарные но необходимые:
  • графический девайс - экземпляр IDirect3DDevice9, это корневой объект граф. подсистемы. Девайс всегда привязан к окну винды (хотя можно рендерить в несколько окон) и предоставляет набор низкоуровневых функций для управления отрисовкой
  • рендер стейт - render state, режим отрисовки, например "рисовать с наложением по alpha-каналу" или "отключить буфер глубины" или "включить аппаратный туман" и т.п. Существует около 60 различных рендер стейтов. Для управления фильтрацией и адресацией текстур существуют sampler state-ы
  • вершинный буфер - хранит массив вершин в видеопамяти. Вершина состоит из одного и более элемента: позиция, нормаль, текстурные координаты, цвет и др. Вершинный буфер обычно отрисовывается как набор треугольников (полигонов), по 3 вершины на полигон, с возможностью использовать одну вершину в нескольких полигонах (для этого существует индексный буфер). Можно также рисовать линии (пара вершин=отрезок) или точки, этим управляет primitive type в DIP
  • шейдер/эффект - программа выполняемая на GPU (Graphics Processing Unit) видеокарты, оформляется файлом .fx или .hlsl (или др. расширение как угодно), содержит две обязательных функции называемых "вершинный шейдер" (vertex shader) и "пиксельный шейдер" (pixel shader) соответственно. Вершинный шейдер получает поток вершин из вершинного буфера и подаёт на выход экранные координаты вершины и доп. данные для пиксельного шейдера. Пиксельный шейдер принимает эти данные (например текстурные координаты) и вычисляет цвет конкретного пиксела для отправки на выход (экран или off-screen surface). Результирующий пиксел проходит ряд тестов (тест глубины и др.) и смешивается с текущим содержимым экрана в соответствии с тек. рендер стейтами
5. Что надо для создания 3D объекта:
  • загрузить текстуры и шейдеры из соотв. файлов
  • загрузить вершинные и индексные данные из файлов в определённом формате (сильно зависит от движка, но можно юзать готовый ID3DXMesh и формат .x)
  • задать позицию, размер и ориентацию в пространстве
  • настроить доп. параметры (например настройки материала)
6. Что такое bounding box и frustrum culling: не все 3D объекты попадут в поле зрения камеры в конкретный момент времени. Для сокращения кол-ва отрисовываемых объектов (и повышения FPS), каждый объект представляется в виде охватывающей коробки - bounding box. У камеры в свою очередь есть пирамида видимости (frustrum), где нижняя и верхняя грани - это дальняя и ближняя плоскости (far/near planes) а боковые поверхности соответствуют краям экрана (в 3D они расходятся с увеличением расстояния). Если bounding box 3D объекта попадает целиком или пересекается с frustrum-ом камеры, объект считается полностью или частично видимым, значит его отрисовывать надо. Иначе пропускаем.

7. Что ещё нужно для отрисовки геометрии. Вершина состоит из произвольного (определяемого программистом) набора данных (position, normal и т.п.), можно представлять её себе как массив из разного типа элементов. Например: Vector3 (XYZ вектор из 3х float-ов), Single (один флоат), Vector4, ushort и другие. Для указания формата вершины, вводится понятие vertex declaration - массив описателей формата и семантики каждого элемента вершины. Без установки Vertex declaration на девайс отрисовать вершинный буфер нельзя

8. Как считать мировую матрицу и что это вообще такое. Для преобразования координат вершины в экранные координаты, выполняется трансформация "local->world->view->projection", где "local" - это координаты вершины взятые из вершинного буфера, "world" - координаты после мировой трансформации или мировые координаты. Мировые координаты - это позиция вершины в общем 3D пространстве сцены. Все 3D объекты содержат текущую позицию в мировом пространстве. Матрица трансформации для перевода в мировые координаты расчитывается как произведение трёх матриц: масштабирование, поворот, сдвиг. Первое действие соответствует размеру 3D объекта, второе - ориентации в пространстве, третье - позиции в мировых координатах. Оставшиеся две трансформации "view" и "projection" соответствуют камере и размерам окна на экране.

9. Что делает вершинный шейдер для вычисления экранных координат. В вершинный шейдер попадают данные одной вершины, разбитые на элементы (position, normal и т.п.), взятые из вершинного буфера в соответствии с форматом указанным в vertex declaration. Шейдер получает position (это вектор из 3 или 4 флоатов) и трансформирует с пом. матрицы "local->world->view->projection" (обычно local пропускают и называют эту матрицу worldViewProjection). Матрица worldViewProjection считается способом описанным выше и представляет собой матрицу 4x4 флоатов. Результат трансформации - вектор XYZW, где первые три координаты делённые на четвёртую дают позицию на экране и значение Z для теста глубины. Этот вектор ещё называют однородными координатами или position in clip space или position in homogenous clip space. Матрица worldViewProjection (как и другие данные, на усмотрение программиста) передаётся в шейдер через набор глобальных переменных - из называют константами шейдера.

10. Что делает пиксельный шейдер для вычисления цвета пиксела. Пиксельшейдер принимает доп. данные от вершинного шейдера и имеет в своём распоряжении доступ к текстурам а также константам пиксельшейдера. На основании этого можно к примеру взять пиксел из текстуры по текстурным координатам принятым из вертексшейдера, "осветить" умножением на интенсивность и цвет источника света и вывести в результат.

11. Ну и так далее, рандомные мысли приходящие в голову.


--------------------
user posted image
PM MAIL WWW   Вверх
Rickert
Дата 5.11.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



mr.DUDA, никакого рандома в этом нет. Если ты считаешь что сначала надо рассказывать людям об инициализации окна, не имея базовых классов, вставлять фразы типа "а вот это мы напишем потом" - то пожалуйста напиши свою статью, но ведь ты этого не сделал smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
mr.DUDA
Дата 5.11.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Rickert, если со строк начинать, то большой шанс завязнуть в деталях и так никогда и не добраться до верхнего уровня. Цель моего поста - показать что можно просто объяснить народу основные принципы программирования 3D-графики, хотя бы охватить главные понятия, без которых любая попытка программирования превратится в копипаст. Скомпилировать чужой код и увидеть как он работает это хорошо, но написать свой - ещё лучше.  smile

Цитата(Rickert @  5.11.2008,  11:20 Найти цитируемый пост)
считаешь что сначала надо рассказывать людям об инициализации окна

Про инициализацию не говорилось ни слова, было упоминание что девайс связан с окном, в порядке объяснения что за девайс такой. В таком же духе всё можно разложить по полочкам, потом набросать простой пример игрового цикла ну и так далее.

Цитата(Rickert @  5.11.2008,  11:20 Найти цитируемый пост)
то пожалуйста напиши свою статью, но ведь ты этого не сделал

Ни в коем случае не буду мешать, на собственную статью у меня усидчивости не хватит  smile 

P.S. если не в тему влез, могу удалить свой пост  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
AntonN
Дата 5.11.2008, 18:03 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: нет
Всего: 18



mr.DUDA
Цитата

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

уже на это намекалось, как я понял, статья пишется для себя, а не как учебник.


--------------------
user posted image
PM MAIL WWW   Вверх
Rickert
Дата 6.11.2008, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



Цитата(mr.DUDA @  5.11.2008,  15:18 Найти цитируемый пост)
Rickert, если со строк начинать, то большой шанс завязнуть в деталях и так никогда и не добраться до верхнего уровня.

Значит ты предолгаешь строить дом с крыши? smile 

Цитата(mr.DUDA @  5.11.2008,  15:18 Найти цитируемый пост)
Цель моего поста - показать что можно просто объяснить народу основные принципы программирования 3D-графики, хотя бы охватить главные понятия, без которых любая попытка программирования превратится в копипаст.

Невнимательно читал: 1/5 кода я оставляю за читателем, и если он его не напишет сам - то не сможет ничего делать дальше. Копи/паст тут не прокатит. К тому же объяснений принципов и теории люди в яндексе и гугле найти могут. Я конечно велосипедист, но не до такой степени.
Цитата(mr.DUDA @  5.11.2008,  15:18 Найти цитируемый пост)
Скомпилировать чужой код и увидеть как он работает это хорошо, но написать свой - ещё лучше.

С этим согласен, к этому и идём.
Цитата(mr.DUDA @  5.11.2008,  15:18 Найти цитируемый пост)
P.S. если не в тему влез, могу удалить свой пост

В споре рождается истина, мой друг smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
AntonN
Дата 6.11.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: нет
Всего: 18



Rickert
Цитата

Значит ты предолгаешь строить дом с крыши? 

нет, он предлагает начать с понятия "дом", "несущщие стены", "фундамент", а не с понятий "кирпич", "дверная ручка" и "решетка для вентиляции"  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Rickert
Дата 6.11.2008, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



Цитата(AntonN @  6.11.2008,  11:54 Найти цитируемый пост)
нет, он предлагает начать с понятия "дом", "несущщие стены", "фундамент", а не с понятий "кирпич", "дверная ручка" и "решетка для вентиляции"

не считаешь что начать с кирпича и бетона логичнее?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
AntonN
Дата 6.11.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: нет
Всего: 18



Нет, конечно, я считаю для начала "От и ДО" должны ввести понятия "дом", "фундамент". А потом уже переходить к кирпичам и дверным ручкам.

PS Конечно это только мое имхо.

Это сообщение отредактировал(а) AntonN - 6.11.2008, 13:00


--------------------
user posted image
PM MAIL WWW   Вверх
Rickert
Дата 6.11.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



AntonN, дом и фундамент из чего строят? Из кирпичей или из домов и фундаментов?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
AntonN
Дата 6.11.2008, 20:02 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: нет
Всего: 18



дом стоят по плану.
не нужно так однобоко смотреть.

ADD В общем, если нет желания понять и пересмотреть свою точку зрения, предлагаю оффтоп прекратить smile

Это сообщение отредактировал(а) AntonN - 6.11.2008, 20:05


--------------------
user posted image
PM MAIL WWW   Вверх
mr.DUDA
Дата 7.11.2008, 02:19 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Цитата(Rickert @  6.11.2008,  12:19 Найти цитируемый пост)
не считаешь что начать с кирпича и бетона логичнее?

Смотря для чего, опять же. И для кого объяснять..

Если для строителя-ремесленника, то можно показать что такое кирпич и из чего делается раствор, и как они совмещаются. Ну и дальше как кирпичи укладывать между собой и как стену ложить. Отсюда наверное можно объяснить, как дом строится, но на примере конкретного дома (в котором мы стенку вначале строили из кирпичей), и более-менее понять как там остальные части сделаны и склеены. Но на такой дом уйдёт много времени, т.к. строителю придётся показывать не только как кирпич кладут, а ещё и как провода устроены (электричество провести, розетки поставить), из чего трубы делают (канализацию и водопровод провести), как обои клеить наиболее оптимальным способом, где какую краску и шпаклёвку использовать, какие уголки для плинтусов юзать, как правильно двери навешивать... ну и так далее, улавливаешь идею? Это на годы растянется, и толку - чуть!

С другой стороны, давай-ка мы объясним что такое архитектурный проект, как вообще проектируются здания, из чего состоят, какие этапы при строительстве проходят и какие материалы в общем требуются на постройку. На примере отдельного сарая покажем как сооружение возводят и какую технику используют. На общем примере здания растусуем, какие подходы используют для строительства произвольного здания. Разницу видишь?

От общего к частностям а не наоборот - вот правильный подход. Если ты не в состоянии охватить общую картину, донести её в сжатом виде к аудитории, значит тебе придётся рано или поздно столкнуться с тем что ты упрёшься в вопрос "а что дальше?". От строк, списков и более сложных вопросов выйти на охват всего игрового движка - очень маловероятно; двигаясь в обратном направлении - запросто.


--------------------
user posted image
PM MAIL WWW   Вверх
Rickert
Дата 7.11.2008, 04:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



Вообще пусть каждый пишет так, как считает нужным smile 
Я выбрал такой путь - как мне кажется так дома не строили ещё. А что получится на выходе - увидим.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
noKEmoH
Дата 7.11.2008, 13:10 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



Rickert  короче чтобы не цеплялись, на главной странице напиши примерную структуру классов с описанием, что и зачем нужно, и все будет  smile . 
PM MAIL   Вверх
Rickert
Дата 9.11.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



Цитата(noKEmoH @  7.11.2008,  13:10 Найти цитируемый пост)
Rickert  короче чтобы не цеплялись, на главной странице напиши примерную структуру классов с описанием, что и зачем нужно, и все будет

Нет, не буду, пусть цепляются, а то людям заняться нечем будет smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
mr.DUDA
Дата 9.11.2008, 19:48 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Rickert, давай просим !!!!!!!!!!!!!!!!!!!  smile  smile  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
arilou
Дата 11.11.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Rickert, ты не прав в том, что чтобы написать свой класс rickert::string не нужно ставить перед собой цель сделать движок. А mr.DUDA прав в том, что разрабатывать систему нужно от общего к частному. И описание, которое он привел - это реальный результат работы над 3D движком. 

Обратный пример (от частного к общему) у нас с ним перед глазами, можешь поверить на слово  smile Не взлетит, если таким образом поступать.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Rickert
Дата 11.11.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



arilou, путь к взлёту лежит через школу, тренажёры, наземную практику и тысячи - тысячи других процедур


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
arilou
Дата 11.11.2008, 20:39 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Цитата(Rickert @ 11.11.2008,  16:18)
arilou, путь к взлёту лежит через школу, тренажёры, наземную практику и тысячи - тысячи других процедур

которые никакого отношения не имеют к геймдеву  smile 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
AntonN
Дата 11.11.2008, 22:00 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: нет
Всего: 18



оставьте человека в покое, он уже сказал, что ничего менять не будет  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Ryoga
Дата 12.11.2008, 01:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 3
Всего: 6



Скорее соглашусь с последним оратором. Каждый имеет право на свой путь в геймдеве. smile Думаю, что читатель, по крайней мере прочитав статью и комментарии, может для себя решить, насколько ему придерживаться этой статьи. Посему также призываю знающих товарищей высказывать свои комментарии по поводу статей. smile Возможно это поможет их улучшить, в конце-концов.
PM MAIL   Вверх
nerezus
Дата 16.11.2008, 11:34 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



Эм, а можно вопрос:
зачем оно надо, если оно дублирует СТАНДАРТНЫЕ классы языка C++?

Нет, я конечно понимаю, что НЕКОТОРЫМ нубам влом учить стандартные классы, но таких далеко не большинство.
Да и собственный костыль НЕ упростит им задачу, но создаст сложности тем, кто уже знает C++(как минимум время на изучение класса)


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
noKEmoH
Дата 16.11.2008, 14:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



...а когда я  писал двигло, мне говорили зачем пишеш есть ирлич готовый, есть нубала готовый, бери и юзай...
PM MAIL   Вверх
nerezus
Дата 16.11.2008, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



noKEmoH, разные ситуации.
В одной ситуации старая штука не удовлетворяет требованиям и надо писать новую с абсолютно другой структурой, в другой же достаточно добавить пару необходимых методов в стандартный класс.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
noKEmoH
Дата 17.11.2008, 14:21 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



понимаю, свой класс никогда не будет быстрее стандартных, но всетаки он будет свой smile . Давайте посмотрим что получится.
PM MAIL   Вверх
nerezus
Дата 17.11.2008, 14:26 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



Цитата

понимаю, свой класс никогда не будет быстрее стандартных, но всетаки он будет свой
 Ну я не вижу тут плюсов кроме минусов:
1) неотлажен
2) недокументирован
3) нераспространен


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Ryoga
Дата 17.11.2008, 15:59 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 3
Всего: 6



Собственно почему не будет быстрее? Стандартные то классы должны быть написаны для общих случаев и не факт, что на каком-то примере, который имеет место быть в пишущейся программе, этот класс будет быстрее, чем тот, который будет написан самостоятельно под конкретную задачу. Так что, иногда можно и свой класс написать, если уж задача реально требует экономии в каких-либо местах, иначе безбожно тормозит. А так, лучше использовать проверенное старое, по тем причинам, что обозначены выше. Короче, начинать лучше со стандартных средств. Думаю это всего касается.
PM MAIL   Вверх
noKEmoH
Дата 17.11.2008, 23:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



ну вобщем да, итераторы тормознее указателей. А насчет минусов несогласен, я думаю что куча народу на форуме тут же обругает и ткнет носом в не отлаженые баги. Какая - никакая, а документация ведется да и распространение будет по крайней мере частью читателями темы. А зачем нужны аналоги стандартных классов, и насколько они полезны можно будет узнать после последней компиляции всего движка. ...надо погодить со спорами...
PM MAIL   Вверх
Rickert
Дата 18.11.2008, 05:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



Цитата(nerezus @  17.11.2008,  14:26 Найти цитируемый пост)
 Ну я не вижу тут плюсов кроме минусов:
1) неотлажен
2) недокументирован
3) нераспространен 

1) Никто не сказал что вам подадут блюдечко с голубой коёмочкой, а на нём движок.
2) Смеётесь? Что тут документировать? Спорные моменты, где так сразу не въедешь что и как происходит - рассказал.
3) Тут дело за вами smile 

P.S.
Со след. статьёй сильно задерживаюсь, простите: личные заморочки.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Rickert
Дата 18.11.2008, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



Цитата(noKEmoH @  17.11.2008,  23:50 Найти цитируемый пост)
ну вобщем да, итераторы тормознее указателей. А насчет минусов несогласен, я думаю что куча народу на форуме тут же обругает и ткнет носом в не отлаженые баги. Какая - никакая, а документация ведется да и распространение будет по крайней мере частью читателями темы. А зачем нужны аналоги стандартных классов, и насколько они полезны можно будет узнать после последней компиляции всего движка. ...надо погодить со спорами... 

Ну вот и единомышленник.
Кому приятно играть в игры, типа Crysis, bioshok - которые написаны для продажи? Вам нужно апгрейдить комп, вам нужно переплачивать деньги. А за что? За то что кто-то писал движок для продажи? Лично я убеждён, что для каждой игры должен быть свой "заточеный" движок, что игры делаются в первую очередь для игроков, а не для рынка. Ну а сейчас совсем другая мода. Ладно, носите туфли, а я буду ходить в практичных кедах smile 
Вообще есть идея основать фирму, которая бы занималась бесплатными играми серьёзного уровня. В процессе разработки и после выпуска игры, разместить кнопку аля "Donate" - и пусть уж сами игроки оцениваю то на сколько хороша игра. На эти средства поддерживать сервер, и после, возможно, выдавать зп "работникам". Понимаю, мало кто сейчас может разделить энтузиазм, но я не вижу другого варианта изменения современных событий в РИ.
Да - да, много кто тут сейчас напишет "да писать движки под каждую игру - это монструозный труд, тем более в свободное время, нам работать надо". Ну вот и работайте, а я пока сколько играми занимаюсь: не видел задач настолько монструозных, чтобы не решить их. Просто человек - скотинка ленивая и ему проще пойти поваляться на диване, нежели напрячь свой мозг лишний раз. К тому: ну раз, другой поработаете с bsp-деревьями, и комбинированной скелетной анимацией - разберётесь и на всю жизнь запомните, а то как будето каждйы раз надо будет новые технологии сложнейшего уровня осваивать.

"Планета вертится, потому что я в неё упираюсь!"

Это сообщение отредактировал(а) Rickert - 18.11.2008, 06:11


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Lazin
Дата 18.11.2008, 06:20 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



Цитата(noKEmoH @  17.11.2008,  23:50 Найти цитируемый пост)
ну вобщем да, итераторы тормознее указателей.

детский сад
PM MAIL Skype GTalk   Вверх
Ryoga
Дата 18.11.2008, 13:10 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 3
Всего: 6



Ооооооооой, Бог мой. -_- Да нет, детский сад, это пост перед этим. Где-то, по-моему, я это всё уже читал в соседних темах. Короче, Rickert, прежде чем гнуть пальцы сделайте хоть одну бесплатную игру "серьёзного уровня" по такой системе. Желательно удачную. Желательно не одну. И будет Вам почёт и уважение. Вот тогда и будете рассказывать, какие все кругом жадные, и какой Вы альтруист - иначе цена всем этим словам ноль.
PM MAIL   Вверх
Rickert
Дата 19.11.2008, 04:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
arilou
Дата 19.11.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61




M
arilou
всем, остыньте немного. каждая точка зрения имеет право на существование



--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Ryoga
Дата 19.11.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 3
Всего: 6



Rickert, мой комментарий касался не статьи, а вот этого замечательного сообщения, о чём я и написал.

Цитата
Кому приятно играть в игры, типа Crysis, bioshok - которые написаны для продажи? Вам нужно апгрейдить комп, вам нужно переплачивать деньги. А за что? За то что кто-то писал движок для продажи? Лично я убеждён, что для каждой игры должен быть свой "заточеный" движок, что игры делаются в первую очередь для игроков, а не для рынка. Ну а сейчас совсем другая мода. Ладно, носите туфли, а я буду ходить в практичных кедах  
Вообще есть идея основать фирму, которая бы занималась бесплатными играми серьёзного уровня. В процессе разработки и после выпуска игры, разместить кнопку аля "Donate" - и пусть уж сами игроки оцениваю то на сколько хороша игра. На эти средства поддерживать сервер, и после, возможно, выдавать зп "работникам". Понимаю, мало кто сейчас может разделить энтузиазм, но я не вижу другого варианта изменения современных событий в РИ.
Да - да, много кто тут сейчас напишет "да писать движки под каждую игру - это монструозный труд, тем более в свободное время, нам работать надо". Ну вот и работайте, а я пока сколько играми занимаюсь: не видел задач настолько монструозных, чтобы не решить их. Просто человек - скотинка ленивая и ему проще пойти поваляться на диване, нежели напрячь свой мозг лишний раз. К тому: ну раз, другой поработаете с bsp-деревьями, и комбинированной скелетной анимацией - разберётесь и на всю жизнь запомните, а то как будето каждйы раз надо будет новые технологии сложнейшего уровня осваивать.


Ждём Ваших игр.
PM MAIL   Вверх
Lazin
Дата 19.11.2008, 12:22 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



мое утверждение касалось только того, что итераторы, якобы тормознее указателей... это только детям дошкольного возраста можно рассказывать smile 
PM MAIL Skype GTalk   Вверх
arilou
Дата 19.11.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61




 ! 
arilou
повторяю еще раз, последний: за все дальнейшие посты, содержащие прямые или косвенные переходы на личности, начну плюсовать. дискутируйте, пожалуйста, в рамках приличий



--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Rpahut
Дата 21.11.2008, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



Флеймеры smile 
Rickert , жду третью часть smile 
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
BalmaR
Дата 22.11.2008, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 11.11.2008

Репутация: нет
Всего: нет



Классные занятие, сам тока вливаюсь
PM MAIL   Вверх
Dobermann
Дата 22.11.2008, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



3 часть  smile 
PM   Вверх
php
Дата 29.11.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.2.2003

Репутация: 3
Всего: 3



Цитата

Кому приятно играть в игры, типа Crysis, bioshok - которые написаны для продажи? Вам нужно апгрейдить комп, вам нужно переплачивать деньги. А за что? За то что кто-то писал движок для продажи? Лично я убеждён, что для каждой игры должен быть свой "заточеный" движок, что игры делаются в первую очередь для игроков, а не для рынка. Ну а сейчас совсем другая мода. Ладно, носите туфли, а я буду ходить в практичных кедах  
Вообще есть идея основать фирму, которая бы занималась бесплатными играми серьёзного уровня. В процессе разработки и после выпуска игры, разместить кнопку аля "Donate" - и пусть уж сами игроки оцениваю то на сколько хороша игра. На эти средства поддерживать сервер, и после, возможно, выдавать зп "работникам". Понимаю, мало кто сейчас может разделить энтузиазм, но я не вижу другого варианта изменения современных событий в РИ.
Да - да, много кто тут сейчас напишет "да писать движки под каждую игру - это монструозный труд, тем более в свободное время, нам работать надо". Ну вот и работайте, а я пока сколько играми занимаюсь: не видел задач настолько монструозных, чтобы не решить их. Просто человек - скотинка ленивая и ему проще пойти поваляться на диване, нежели напрячь свой мозг лишний раз. К тому: ну раз, другой поработаете с bsp-деревьями, и комбинированной скелетной анимацией - разберётесь и на всю жизнь запомните, а то как будето каждйы раз надо будет новые технологии сложнейшего уровня осваивать.


Вот это крруто, вот это аж меня воодушевило вернуться в игрострой даже - честно..!!
Каков этузиазм просто поражает.. Rickert уважаю..

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

Теперь по циклу статей, что начал писать Rickert, должен сказать что это пригодится как для базового понимания самого языка, стиля и метода программирования на С++, так и очень сильно пригодится впоследствии уже при написании самого движка особенно при написании GUI (так называемого графического пользовательского интерфейса) вывод и ввод текста при выводе игровой консольки к примеру, а написание GUI поверьте по собственному опыту говорю - это на самом деле очень сложная задача..

Статьи получились необычные конечно, но кое что я оттуда я подчерпнул интересное, да как сказать подчерпнул - узнал многое!, так что ждём продолжения. Rickert молодца так держать !!!! smile 
--------------------
Джедаи не пройдут..
PM MAIL   Вверх
nerezus
Дата 29.11.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



Цитата

Кому приятно играть в игры, типа Crysis, bioshok - которые написаны для продажи?

Мне приятно. Прошел половину биошока на одном дыхании.

Цитата

Вам нужно апгрейдить комп, вам нужно переплачивать деньги.
 Бла бла бла, бред. Прошел биошок на максималках на нетоповом неновом железе.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
php
Дата 29.11.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.2.2003

Репутация: 3
Всего: 3



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

Это скриншот из GR Engine 2.0 (2006 год) поддержка относительно небольшого кол-ва полигонов ..
user posted image

Это скриншоты уже из GR Engine 3.0 доработанная версия, поддержка большого кол-ва
полигонов..

user posted image
                                  Pic. 1
                                       
user posted image
                                  Pic. 2

Это сообщение отредактировал(а) php - 29.11.2008, 14:39
--------------------
Джедаи не пройдут..
PM MAIL   Вверх
Rickert
Дата 29.11.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



"Земля крутится - потому что я в неё упираюсь" smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Ryoga
Дата 29.11.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 3
Всего: 6



php, создайте себе тему отдельную - будете сообщать там о своих успехах по доработке движка. Было бы интересно. smile
PM MAIL   Вверх
php
Дата 30.11.2008, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.2.2003

Репутация: 3
Всего: 3



Обязательно создам только вот название какое бы придумать? "Программирование игрового движка" к примеру
подойдет или нет как считаете ??

Почему именно программирование т.к описание будет вестись только по программному коду, создание
и разработка 3D-моделей пока затрагиваться не будет (да и в данном разделе форума это и не обсуждается вроде!), т.к созданием моделей занимается другой человек, поэтому по всем аспектам создания и реализации той или 
иной 3D-модели, если что будет адресоваться к нему..

Вот его недавние наработки (боевой корабль Chu Untor, по мотивам вселенной StarWars!)
Кол-во полигонов пока неизвестно, нужно будет уточнить у разработчика (по рисунку видно, что очень много),
соответственно эта модель тоже будет впоследствии как тестовый вариант интегрироваться в GRE (GreenRay Engine)

(С)Master Lucky
user posted image

Это сообщение отредактировал(а) php - 30.11.2008, 07:04
--------------------
Джедаи не пройдут..
PM MAIL   Вверх
AntonN
Дата 30.11.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: нет
Всего: 18



Цитата

по рисунку видно, что очень много

а по моему так мало...


--------------------
user posted image
PM MAIL WWW   Вверх
php
Дата 30.11.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.2.2003

Репутация: 3
Всего: 3



Уверяю! Очень много, на рисунке палубы видите квадратиками идут это не текстура это всё модель, задние круглые двигатели тоже не картинка скриншот сделан из окна 3DS Max, впрочем гадать не будем узнаю точнее у самого разработчика..
--------------------
Джедаи не пройдут..
PM MAIL   Вверх
Ryoga
Дата 30.11.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 3
Всего: 6



php, в названии как-то укажите, что это Вы свой движок разрабатываете. smile "Разработка графического движка GreenRay Engine" или типо того. Короче, главное, чтобы понятно было. smile
PM MAIL   Вверх
Rickert
Дата 1.12.2008, 04:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



 smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
php
Дата 1.12.2008, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.2.2003

Репутация: 3
Всего: 3



Цитата

В названии как-то укажите, что это Вы свой движок разрабатываете.  "Разработка графического движка GreenRay Engine" или типо того. Короче, главное, чтобы понятно было.


Ну это уже всё имеется, собственно.. smile 

Rickert приносшу свои извинения, что развёл тут всю эту "бадягу" в вашем топике, 
удаляюсь..  smile 
--------------------
Джедаи не пройдут..
PM MAIL   Вверх
Master Lucky
Дата 22.4.2009, 05:51 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 22.1.2008
Где: Торонто, Канада

Репутация: нет
Всего: нет



Цитата(AntonN @ 30.11.2008,  10:25)
Цитата

по рисунку видно, что очень много

а по моему так мало...

Извиняюсь за офф топик, просто хочу встать на защиту своей модели.

В модели 78 725 поликов и это она ещё выполнена на 30%

AntonN это тебе мало?


 ! 
arilou
извинение не является причиной игнорирования правил!


Это сообщение отредактировал(а) arilou - 22.4.2009, 15:06
PM MAIL   Вверх
Rickert
Дата 22.4.2009, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 6
Всего: 52



Master Lucky, для этого существуют личные сообщения.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.2241 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.