GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (208 стр.)

Сообщения на форуме пользователя Andrey (208 стр.)

Корректная обработка результатов столкновения камеры и объектов сцены23 ноя. 200513:31#5
Gaco
Не вектор у меня не большой по длине...
All
Еще есть варианты?
Корректная обработка результатов столкновения камеры и объектов сцены22 ноя. 200519:36#4
Gaco
>Не думаю что коректно обрабатывать попадания вершин в ббоксы - на больших скоростях ты будеш просто проскакивать >через обьекты.
>Лучше соединять предыдущее положение и текущее отрезком и проверять ббоксы и отрезок на пересечение.
поподробнее расскажи что-то не совсем понятно
>Попробуй поставить после вычислений Vpr:
>assert( length(Vpr) < 100.0f );
>Возможно неправильно считаеш вектор.
ага попробую но только такой длины он не может быть...
Scart
>Ты не пробовал использовать первый алгоритм, но проверять возможность прохода заранее, т.е. если можно двигаться в этом направлении на шаг (не знаю чему он у тебя равен), то двигай, а если нет, то оставляй положение камеры без изменения.
над этим немного думал но не совсем так.
тут есть определенные сложности нужно дополнительно 4 переменные определяющие
куда будет двинаться камера при следующем шаге. Но я его еще раз попробую...
All
Есть еще варианты?
Корректная обработка результатов столкновения камеры и объектов сцены22 ноя. 20054:54#0
Привет всем!!!
эта тема поднималась долго но мне ничего подходящего не пригодилось :(
Я построил Octree дерево сцены.Хочу реализовать реалистичные столкновения камеры с полигональной моделью.
Пока у меня сделано определение столкновений. В этом случае касмеру просто откидывает на предыдйущее место столкновения.
Реализовано это за счет хранения предыдущего вектора положения в камере.
Камера хранит Bounding Box игрока.
Алгоритм у меня такой:
1) Если попали в узел Octree дерева который является листом;
2) проходимся по полигонам внутри его(их как раз там не много);
3) если хотя-бы 1 из вершин полигона попала в Bounding Box камеры то мы вектор присваиваем ей предыдущее положение.
4) выход из цикла...
Я его хочу изменить алгоритм при столкновении сделать плавное скольжение вдоль стены.
для этого я делал так:
После столкновения:

1) строим плоскость по 3 точкам полигона
2) берем проекцию вектора нправления на плоскость X0Z т.е. на плоскость земли (у меня ось Y направлена вверх)
пусить это вектор Vpr;
3) берем проекцию вектора Vpr на плоскость полигона;
4) вычисляем новое положение камеры как ее текущее + Vpr
Это иногда корректно работает когда сталкиваешься с объектом не больших габаритов например со столбом,
если объекты больших габаритов, то иногда вылетаешь в другой конец сцены...

Прошу помощи над этим долго бьюсь зашел в тупик, стою на месте...
Что я делаю не так? Есои нужно привести необходимый код, скажите я приведу.

Нужен исходник примера из DirectX 9 SDK19 ноя. 200515:04#10
Morpeh
и мне пожалуйста, пригодится :)

правка синтаксис...

Правка: 19 ноя. 2005 15:05

CubeMap в Direct3D 9.019 ноя. 20050:58#17
User007
спасибо за подсказку действительно надо очищать!!!
я разобрался и нашел ошибку оказывается
1) надо было в сцене вызывать Clear и не вызывать Begin() и End()
2) далее я не удалил
IDirect3DCubeTexture9*
т.е. надо добавить pCubeMap -> Release();

спасибо вам всем за помощь!!! :)
CubeMap в Direct3D 9.018 ноя. 200521:25#15
User007
>не понял - ты при рендере в cubemap не очишаешь предварительно z & color? Попробуй очищать.
дак надо же не очищать вроде?
ладно я попробую...
Вывод текста в OpenGL18 ноя. 200515:01#3
Ferrum Mamuth
незачто...
надо теперь почитать доки... :)
Вывод текста в OpenGL18 ноя. 200514:44#1
Ferrum Mamuth
GLvoid BuildFont(GLvoid)
{
  HFONT  font;
  base = glGenLists(96);
  hDC = GetDC(NULL); //надо контекст окна получить
font = CreateFont(  -24, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET,
                OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
              ANTIALIASED_QUALITY, FF_DONTCARE|DEFAULT_PITCH, "Courier New");
  SelectObject(hDC, font);
  wglUseFontBitmaps(hDC, 32, 96, base);
}
[/code]
лучше использовать glut там есть средства для вывода текста...

Правка: 18 ноя. 2005 14:54

CubeMap в Direct3D 9.018 ноя. 200512:58#12
IronBunny
>попробуй так:
>сначала своим цыклом отрендерить все в cubemap,
>затем после hr = pRenderToEnvMap -> End(0); пройтись по всем фейсам и сохранить их.
>а то ведь пытаешься сохранить то, что установлено как rendertarget
я тебя понял, завел 6 IDirect3DSurface9*, все сделал после цикла деинициализацию и сохранение текстур ситуация
такая-же :(
Paronator
Попробую твой код спасибо :)
User007
нет естественно!! там я флаг ставлю если рендер в CubeMap то не очищаю...
CubeMap в Direct3D 9.018 ноя. 20050:11#9
User007
IronBunny
>а если в другой формат - bmp?
то-же самое :(
User007
там целый двиг :) на 8 МБ с ресурсами :)
All
а Вот тоже самое вставляю в пример DirectX SDK 9.0 и все ок сохраняет моджет у меня глюк?
CubeMap в Direct3D 9.017 ноя. 200521:14#7
IronBunny
>а если в другой формат - bmp?
попробую...
>D3DXSaveSurfaceToFile - что возвращает?
в том то и дело что S_OK!!!
Ilia
>Сохранение в jpg в DX9 глючное...Так и должно быть.
хм... во как :)
CubeMap в Direct3D 9.017 ноя. 200515:38#4
morffiy
>pFace -> Release();
>Возвращает количество ссылок на данный обьёкт, это не ошибка.
хорошо тогдп почему у меня получается некорретно сохраняется изображение?
вот оно:
Изображение удалено
CubeMap в Direct3D 9.017 ноя. 200512:23#2
User007
>Чего ЗДЕСЬ происходит??
>remove(buf); <------------------------
удаляется предыдуший файл(если даже и не был создан) на всякий случай...
о остальное
сохранение поверхность в файл т.е. screenshot плоскосити куба
т.к. i меняется от 0 до 6 то файлы записываются под именами cube1.jpg,...,cube6.jpg
или ты не это имел ввиду?
CubeMap в Direct3D 9.017 ноя. 20051:35#0
Привет всем!!!
пробую разобраться с кубическими текстурами.
Я хочу сохранить 6 текстур.
2 проблемы
- ошибка при деиницилизации IDirect3DSurface9;
- некорректно сохраняет 6 текстур.
Все делал по примеру из DirectX SDK 9.0
Видеокарта Radeon 9200SE, Visual C++ .Net 2003, Windows XP
вот код:
void DrawScene()
{
	...
	enum {CUBEMAP_RESOLUTION = 256};
	...
	D3DSURFACE_DESC d3dsdBackBuffer;
	IDirect3DSurface9* pFace = NULL;
	HRESULT hr = 0;
	hr = pDevice -> GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pFace);
    	hr = pFace -> GetDesc(&d3dsdBackBuffer);
	hr = pFace -> Release();

	IDirect3DCubeTexture9* pCubeMap = NULL;
	enum {SIZE = 256};
	hr = pDevice -> CreateCubeTexture(SIZE, 1, D3DUSAGE_RENDERTARGET, d3dsdBackBuffer.Format,
                               D3DPOOL_DEFAULT, &pCubeMap, NULL);
	...
	//рендер в текстуру
	ID3DXRenderToEnvMap* pRenderToEnvMap = NULL;
	// Create RenderToEnvMap object
	hr = D3DXCreateRenderToEnvMap(pDevice, CUBEMAP_RESOLUTION, 1,
        d3dsdBackBuffer.Format, TRUE, D3DFMT_D16, &pRenderToEnvMap);
	...
	// Save transformation matrices of the device.
    	D3DXMATRIX matProjSave;
	D3DXMATRIX matViewSave;
    	pDevice -> GetTransform(D3DTS_VIEW,       &matViewSave);
    	pDevice -> GetTransform(D3DTS_PROJECTION, &matProjSave);
	// Set the projection matrix for a field of view of 90 degrees
	D3DXMATRIX matProj;
	D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI * 0.5f, 1.0f, camera.GetzNear(), camera.GetzFar());
	pDevice -> GetTransform(D3DTS_PROJECTION, &matProj);
    	// Standard view that will be overridden below.
    	D3DXMATRIX matView;
	hr = pRenderToEnvMap -> BeginCube(pCubeMap);
    	for(unsigned int i = 0; i < 6; i++ )    {

		hr = pRenderToEnvMap -> Face(static_cast<D3DCUBEMAP_FACES>(i), 0 );

		D3DXVECTOR3 vEnvEyePt;
		vEnvEyePt.x = 0.0f;
		vEnvEyePt.y = 0.0f;
		vEnvEyePt.z = 0.0f;
		D3DXVECTOR3 vLookatPt;
		D3DXVECTOR3 vUpVec;
		switch(i) {
			case D3DCUBEMAP_FACE_POSITIVE_X:
                vLookatPt = D3DXVECTOR3( 1.0f, 0.0f, 0.0f );
                vUpVec    = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
                break;
            case D3DCUBEMAP_FACE_NEGATIVE_X:
                vLookatPt = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
                vUpVec    = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
                break;
            case D3DCUBEMAP_FACE_POSITIVE_Y:
                vLookatPt = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
                vUpVec    = D3DXVECTOR3(0.0f, 0.0f,-1.0f);
                break;
            case D3DCUBEMAP_FACE_NEGATIVE_Y:
                vLookatPt = D3DXVECTOR3(0.0f,-1.0f, 0.0f);
                vUpVec    = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
                break;
            case D3DCUBEMAP_FACE_POSITIVE_Z:
                vLookatPt = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
                vUpVec    = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
                break;
            case D3DCUBEMAP_FACE_NEGATIVE_Z:
                vLookatPt = D3DXVECTOR3(0.0f, 0.0f,-1.0f);
                vUpVec    = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
                break;
	}
        D3DXMatrixLookAtLH(&matView, &vEnvEyePt, &vLookatPt, &vUpVec);
        pDevice -> SetTransform(D3DTS_VIEW, &matView);
		RenderScene();
		if (pCubeMap)
			hr = pCubeMap -> GetCubeMapSurface(static_cast<D3DCUBEMAP_FACES>(i), 0, &pFace);
		char buf[20] = {'\0'};
		//получить имя файла
		sprintf(buf, "cube%d%s", i + 1, ".jpg");
		//удалить
		remove(buf);
		//сохранить
		D3DXSaveSurfaceToFile(buf, D3DXIFF_JPG, pFace, NULL, NULL);
		if (pFace)
			hr = pFace -> Release(); //вот тут ошибка 	hr = 0x00000002 Не удается найти указанный файл.

    }
	hr = pRenderToEnvMap -> End(0);
	hr = pRenderToEnvMap -> Release();
    // Restore the original transformation matrices.
	pDevice -> SetTransform(D3DTS_VIEW,       &matViewSave);
    pDevice -> SetTransform(D3DTS_PROJECTION, &matProjSave);
}
что я делаю не так?
Спасибо всем заранее.
С Уважением Андрей.

Правка: 17 ноя. 2005 1:36

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр