Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 09.12.2011, 18:34   #16
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Тормоза opengl

ну с индексацией наверное что то. покажи код.


реквестирую еще котов в тред
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Dream (09.12.2011)
Старый 09.12.2011, 20:15   #17
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Злость Ответ: Тормоза opengl

//функция установки фрейма (skin->SetVertices)
//сбросить все точки в стартовые позиции
	for(int j=0;j<cntVerts;j++)
	{
		verts[j*3] = src[j].coord[0];//src это статичные данные о сетке, verts это которые получит потом видеокарта
		verts[j*3+1] = src[j].coord[1];
		verts[j*3+2] = src[j].coord[2];
	}
	for(int i=0;i<bone.size();i++)
	{
		if(frame>= bone[i]->frames.size()) frame=0;//проверяю на окончание всех кадров
		float* cBone = bone[i]->GetTransformedBone((int)frame);//трансформированая кость (глобально) 
		for(int j=0;j<bone[i]->verts.size();j++)//пройтись по всем вершинам этой кости
		{		
			int idv = bone[i]->verts[j].id;//текущая кость
			float weight = bone[i]->verts[j].weight;//ее вес
			float *pos = RotatedXYZ(//узнать новую позицию
				verts[idv*3], 
				verts[idv*3+1], 
				verts[idv*3+2],
				bone[i]->frames[frame]->rotation[1],//x если вычисления новой позиции не производить то модель нормально отображается
				bone[i]->frames[frame]->rotation[2],//y
				bone[i]->frames[frame]->rotation[3],//z
				bone[i]->frames[frame]->rotation[0]);//w
			verts[idv*3] = pos[0];//+cBone[0];//тут хз, 
			verts[idv*3+1] = pos[1];//+cBone[1];
			verts[idv*3+2] = pos[2];//+cBone[2];
		}
	}
//трансформированая кость (глобально) функция рекурсивная
float* sBoneSkin::GetTransformedBone(int frame)
{
	float* bypos;
	if(parent!=NULL) bypos = parent->GetTransformedBone(frame);//пособирать позиции у парентов
	else 
	{
		bypos = new float[3];
		bypos[0] = frames[frame]->position[0]; 
		bypos[1] = frames[frame]->position[1]; 
		bypos[2] = frames[frame]->position[2];
	}
	float* pos = RotatedXYZ(bypos[0],bypos[1],bypos[2],
		frames[frame]->rotation[1],frames[frame]->rotation[2],frames[frame]->rotation[3],frames[frame]->rotation[0]);
	return pos;
}

//вычисление позиции функция
float* RotatedXYZ(float vx, float vy, float vz, float bq0, float bq1, float bq2, float bq3)//w третья
{
	float xxzz = bq0*bq0 - bq2*bq2;
	float wwyy = bq3*bq3 - bq1*bq1;
	float xw2 = bq0*bq3*2.0;
	float xy2 = bq0*bq1*2.0;
	float xz2 = bq0*bq2*2.0;
	float yw2 = bq1*bq3*2.0;
	float yz2 = bq1*bq2*2.0;
	float zw2 = bq2*bq3*2.0;
	float ret[3];
	ret[0] = (xxzz + wwyy)*vx + (xy2 + zw2)*vy       + (xz2 - yw2)*vz;
	ret[1] = (xy2 - zw2)*vx   + (bq1*bq1+bq3*bq3-bq0*bq0-bq2*bq2)*vy + (yz2 + xw2)*vz;
	ret[2] = (xz2 + yw2)*vx   + (yz2 - xw2)*vy       + (wwyy - xxzz)*vz;
	return ret;
}

//функция передачи буфера видеокарте
void cMeshNode::UpdateVBO()//для анимаций
{
	if(skin==NULL) return;//ниче не делать если нет анимации
	skin->SetVertices(vertices, buf_verts,cntVerts,current_frame);//та что самая первая в этом посте
	glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBO_verts );	
	glBufferSubDataARB(GL_ARRAY_BUFFER_ARB,0,cntVerts*3*sizeof(float),&buf_verts[0]);//ну тут я заменяю старый буфер буфер
	current_frame+=0.1f;
}


//функция отрисовки (не к теме, тут все норм, правда медленный алгоритм)
void cMeshNode::DrawVBO(GLenum draw_mode)
{
	if(cntVerts<=0) return;
	glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBO_verts );					//вершины
    glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL );
	glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBO_normals );				//нормали
	glNormalPointer( GL_FLOAT, 0, (char*)NULL);
	glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBO_texcoords );				//текстуры
    glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );
	
	for(int i=0;i<surfaces.size();i++)//рисовать массивами исходя из данных материала (для быстродействия)
	{
		if(surfaces[i]->texture!=NULL)
		{
			glEnable(GL_TEXTURE_2D);
			surfaces[i]->texture->Bind();
		}
		else
		{
			glDisable(GL_TEXTURE_2D);
		}
		int start = 0;
		int end = 0;
		start = surfaces[i]->surfaceNum * 3;
		if(i<surfaces.size()-1)
			end =  surfaces[i+1]->surfaceNum * 3;
		else end = cntIndices;
		glDrawRangeElements(draw_mode, 0, cntIndices, end-start,GL_UNSIGNED_INT,&indices[start]);
	}
}
ХЗ как на форуме запрятать эту портянку в кнопку так что сорри

ЗЫ. Заодно посмотрите может где код парашный...

Последний раз редактировалось pozitiffcat, 09.12.2011 в 21:59.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 21:22.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com