Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: Создать камеру в DirectX 9  (Прочитано 116311 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #30 : 01-07-2009 11:12 » 

я бы сделал примерно так:

mPlanes[6] -это массив -член класса Camera

BeginScene();
{
   //перед началом пересчёт пирамид
   TheCamera1.RefreshPiramid();//это твоя функция CreatePiramid
   TheCamera2.RefreshPiramid();
   //-----------------------------------

   //отрисовываем, используя камеры

    EndScene();
}
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #31 : 01-07-2009 11:25 » 

Я вот в интернете в некоторых местах видел такой способ.

Код:
private:
        struct Planes
        {
                D3DXVECTOR3 m_normal;
                float m_distance;

                inline void Normalise()
                {
                        float denom = 1 / sqrtf((m_normal.x*m_normal.x) + m_normal.y*m_normal.y) + (m_normal.z*m_normal.z));
                        m_normal.x = m_normal.x * denom;
                        m_normal.y = m_normal.y * denom;
                        m_normal.z = m_normal.z * denom;
                        m_distance = m_distance * denom;
                }

                inline float DistanceToPoint(const D3DXVECTOR3& pnt)
                {
                        return D3DXVec3Dot(&m_normal, &pnt) + m_distance;
                }
        } m_Planes[6];

Как думаешь этот способ лучше или хуже чем тот который ты предложил?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #32 : 01-07-2009 11:38 » 

ну, последнее - это не способ, а описание плоскости ) Там же структура описани м массив задан. Думаю, их иожно объединить
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #33 : 01-07-2009 11:54 » 

Так я про это и спрашивал как описать плоскости? В твоём случае это массив класса и больше ничего, а в коде который я привёл в Ответе #31, как-то всё сложно.

Можно ли без этого обойтись, объявив в конструкторе и диструкторе класса следующие строчки?

Конструктор класса

Код:
Matrix = NULL;
mPlanes = new Camera[6];

Диструктор класса

Код:
delete []mPlanes;

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #34 : 01-07-2009 14:19 » 

ничего сложного не вижу: коли уж элементов ровно 6, а наличие их обязательно, то динамику городить не стОит, пусть будут объявлены так, как в предыдущем посте.
Единственное, поюзать уже имеющийся тип плоскостей D3DXPLANE

Код:
 
          struct Planes:D3DXPLANE
         {
                inline void Normalise()
                {
//это всё переписать по смыслу
/*
                        float denom = 1 / sqrtf((m_normal.x*m_normal.x) + m_normal.y*m_normal.y) + (m_normal.z*m_normal.z));
                        m_normal.x = m_normal.x * denom;
                        m_normal.y = m_normal.y * denom;
                        m_normal.z = m_normal.z * denom;
                        m_distance = m_distance * denom;
*/                }

                inline float DistanceToPoint(const D3DXVECTOR3& pnt)
                {
//это всё переписать по смыслу
/*
                        return D3DXVec3Dot(&m_normal, &pnt) + m_distance;
*/
                }
        } m_Planes[6];


class Camera
{
   ....
    Planes Planes m_Planes[6];
....
}


Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #35 : 01-07-2009 14:38 » 

кстати, нашёл таки, как этот мерзкий outlining вырубить
Tools->Options->TextEditor->C/C++->Formatting  (убрать 3 галки посеридине)
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #36 : 02-07-2009 00:18 » 

zuze, кстати, не знаешь, что значит при компиляции надпись

Embedding manifest...

она меня смущает ))
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #37 : 02-07-2009 08:49 » 

Цитата:  Алексей1153++
Embedding manifest...

Вроде она значит что

"не найден "ехе" файл проекта"
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #38 : 02-07-2009 08:52 » 

да нет, компилируется всё нормально. Это надпись о том, что встраивается некий манифест. Шо такое ? )
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #39 : 02-07-2009 08:59 » 

Алексей1153++

А ты мог бы полностью сообщение о предупреждении написать.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #40 : 02-07-2009 09:06 » 

это не предупреждение, это просто лог. Я привёл строчку полностью
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #41 : 02-07-2009 09:14 » 

Манифест - это файл по сути практически тот же ini-файл, простой текстовый файл (в данном случае в формате XML), который содержит настройки для приложений.

Microsoft Visual Studio решается так:

project - properties - configuration properties - manifest tool - input and output - меняем Embed Manifest на No.
Значения:
$(TargetPath).manifest
$(IntDir)\$(TargetFileName).embed.manifest.res
No
$(IntDir)\mt.dep

В Microsoft Visual C++ 6 пока не знаю.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #42 : 02-07-2009 09:29 » 

так я про 2005 студию говорю - я там щас делаю.
Вот в сэмплах нашёл такой файлик
HDRLighting.manifest
Код:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="*"
    name="Microsoft.DirectX SDK.HDRLighting"
    type="win32"
/>
<description>DirectX SDK Sample Program.</description>

<ms_asmv2:trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2">
  <ms_asmv2:security>
    <ms_asmv2:requestedPrivileges>
      <ms_asmv2:requestedExecutionLevel level="asInvoker">
      </ms_asmv2:requestedExecutionLevel>
    </ms_asmv2:requestedPrivileges>
  </ms_asmv2:security>
</ms_asmv2:trustInfo>
 
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #43 : 02-07-2009 09:37 » 

Если ты его не используешь этот файл попробуй отключить, как я написал.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #44 : 02-07-2009 09:44 » 

Можешь попробовать в код вставить строчку

Код:
#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.DirectX SDK.HDRLighting' version='1.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*'\"")
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #45 : 02-07-2009 10:19 » 

ага, через опции убралось. Ещё немного мусора убрали с глаз )))

Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #46 : 02-07-2009 10:23 » 

Алексей1153++
А что ты вдруг решил перейти на на Microsoft Visual Studio 2005?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #47 : 02-07-2009 11:20 » 

( неважно Улыбаюсь )

кстати, у меня со светом почему то не выходит, может я формат FVF не так задаю. Там какие поля требуются ?

Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #48 : 02-07-2009 12:45 » 

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

Вот функция материала и света:

Код:
// Функция установки освещения и материалов
void LightMaterial(void)
{
// Создаём материал
D3DMATERIAL9 Material;
// Создаём освещение
D3DLIGHT9 Light;
D3DXVECTOR3 VectorDir;

// Обнуляем память под материал
ZeroMemory(&Material, sizeof(D3DMATERIAL9));
            // Задаём цвета для диффузного и цвета подсветки
Material.Diffuse.r = Material.Ambient.r = 1.0f;
Material.Diffuse.g = Material.Ambient.g = 1.0f;
Material.Diffuse.b = Material.Ambient.b = 1.0f;
Material.Diffuse.a = Material.Ambient.a = 1.0f;
// Устанавливаем материал
pDirect3DDevice->SetMaterial(&Material);
// Обнуляем память под освещение
ZeroMemory(&Light, sizeof(D3DLIGHT9));
            // Тип света
Light.Type = D3DLIGHT_DIRECTIONAL;
// Количество красного в свете
Light.Diffuse.r = 1.0f;
Light.Diffuse.g = 1.0f;
Light.Diffuse.b = 1.0f;
// Вектор, задающий направление света в доль оси Х
VectorDir = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
// Максимальное расстояние действия источника света
Light.Range = 1000.0f;
// Нормализуем вектор VectorDir и записываем в свойства
            // направления Light
D3DXVec3Normalize((D3DXVECTOR3*)&Light.Direction, &VectorDir);
// Устанавливаем свет
pDirect3DDevice->SetLight(0, &Light);
// Включаем свет с соответсвующим индексом
pDirect3DDevice->LightEnable(0, TRUE);
// Устанавливаем параметры рендеринга, включая освещение
pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, true);
// Устанавливаем параметры рендеринга - ренормализации нормалей
pDirect3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true);
            // Устанавливаем параметры рендеринга - разрешения обработки отражаемой составляющей света
            pDirect3DDevice->SetRenderState(D3DRS_SPECULARENABLE, true);
}

Использовать надо

Код:
#define D3DFVF_TRIANGLEVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)

или (если без текстур)

Код:
#define D3DFVF_TRIANGLEVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #49 : 03-07-2009 00:13 » 

а, понятно, я материал ещё не использовал. Странно, что в книге заговорили про свет раньше мателиалов
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #50 : 03-07-2009 07:22 » 

Я с проблемой со светом столкнулся, когда делал текстуры, я подумал, если у меня текстура, то и материала не нужно, а оказывается нужно.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #51 : 03-07-2009 23:06 » 

Как инициализировать правельно плоскости?

Должна получится усечённая пирамида, притом центр "Ближней плоскости" должнен совпадать с точкой, где соединяются вектора камеры.
« Последнее редактирование: 04-07-2009 00:04 от zuze » Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #52 : 04-07-2009 00:28 » 

Я ошибся мы усечённу пирамиду строим с помощью отдельно разработанной функции, а значит сама структура что нулевыми значениями инициализируется?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #53 : 04-07-2009 00:30 » 

вообще то, ближняя плоскость не должна быть ближе к камере, чем плоскость проекции, иначе начнёт появляться перевёрнутое избражение )

передняя и дальняя плоскости - можно построить по: Z координате+ вектор Look (нормаль ихняя) + вектор Up (он параллелен плоскостям)

насчёт боковых - так быстро я не соображу щас )
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #54 : 04-07-2009 00:31 » 

Я ошибся мы усечённу пирамиду строим с помощью отдельно разработанной функции, а значит сама структура что нулевыми значениями инициализируется?
про какую структуру речь ?

сами матрицы и вектора не инициализируются, кстати. Обнулять лучше
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #55 : 04-07-2009 00:35 » 

Я имею в виду структуру m_Planes[6], а усечённая пирамида строится с помощью функции, которую я описал в "Ответе #29".
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #56 : 04-07-2009 00:40 » 

обнулять в конструкторе лучше

struct Plane:D3DXPLANE
{
   Plane():D3DXPLANE(0,0,0,0)
  {
  }
};
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #57 : 04-07-2009 00:43 » 

Понял.

А мне ещё посоветовали в функции getViewMatrix для создания матрицы вида использовать D3DXMatrixLookAtLH в место того что я ручками там всё писал.

Это дельный совет?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #58 : 04-07-2009 00:47 » 

ну так то да, у меня тоже через неё сделано

void s_1153_3DCamera::GetView(D3DXMATRIX* pvm)const
{
   ::D3DXMatrixLookAtLH(pvm, &m_Eye, &m_LookPoint, &m_Up);
}
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #59 : 04-07-2009 00:50 » 

Понятно значит дельный совет.

Я сейчас спать я ещё со вчерашней ночи не спал постараюсь в эти выходные доделать и выложить viewing frustum.
Записан
Страниц: 1 [2] 3 4 5   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines