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

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

Проблемы с обменом значений между C/C++ и Lua.25 дек. 200512:34#4
All
Ну еще ктонибудь?
Проблемы с обменом значений между C/C++ и Lua.24 дек. 200521:25#3
Dinosaur
>. Как ты выходишь из цикла while (1) { ... }?
пока никак :) это и не нужно просто это пока тест.
А вообще это как бы главный цикл игры.
>. Я так понял, цикл из второго примера - это замененный цикл из первого? Тогда как переменная поменяет свое значение? >Ты же получаешь ее значение, а потом это же значение без изменений возвращаешь обратно. Причем делаешь это уже >ПОСЛЕ выполнения всего скрипта, когда он сделал все, что от него требовалось.
дак я вот это и предполагаю:
return 2 * dt[0]  --возврат значения умноженного на 2
в скрипте значение должно меняться. это значение получет C/C++ программа его использует(ну пока не использует)
а потом назад дает его.
короче нужно чтобы скрипт менял значение переменной.
в онечном случае на консоль должно выводиться удвоенное значение
Что еще не так?
Спасибо что откликнулся!!
Прошу Оценить Octree-дерево + столкновения24 дек. 200510:48#49
BUzer
>Насчет проверки ааббокса и фрустума - проверять все восемь точек коробки относительно плоскости не обязательно, можно ограничиться >лишь двумя. Как всегда, советую скачать исходники первой квачи, и посмотреть, как там сделана проверка на попадание бокса во фрустум >(функция CullBox, вроде). НеХе курит в сторонке :)
я так и думал :)  напрашивается проверять только max и min.
исходники Quake I посмотрю.
>В столкновения что-то не въехал.. Кстати, а ты что, так и хранишь ориентацию камеры в виде вектора? Углы эйлера использовать не >пробовал?
что не понятно? сделано по подобию www.gametutorias.com Camera Word Collision.
ориентация камеры в виде вектора.
Прошу Оценить Octree-дерево + столкновения23 дек. 200520:58#47
BUzer
Теперь столкновения:
камера хранит AABB если мы в листовом узле, и AABB камеры стокнулся с AABB узла дерева.
то идем по пролигонам узла:
//цикл по полигонам узла:
	//получить позицию камеры
	Position = camera.GetPosition();
	//центр сферы
	sphere.SetCenter(Position);
	//сформировать полигонт
	Triangle3D Triangle(vertice->openGLVertex[0].vert,
		vertice->openGLVertex[1].vert, vertice->openGLVertex[2].vert);
	//вычислить параметры плоскости
	plane.computePlane(&Triangle.a);
	normal = plane.GetNormal();
	// This will store the distance our sphere is from the plane
	plane.computePlane(normal, Triangle.a);
	distance = plane.signedDistanceToPoint(Position);
	//классификация сферы относительно плоскости
	classification = sphere.classify(plane);
	//если пересечение
	if (classification == Plane::INTERSECT_PLANE) {
		Offset = normal * distance;
		// Once we have the offset to the plane, we just subtract it from the center
		// of the sphere.  "Intersection" is now a point that lies on the plane of the triangle.
		Intersection = Position - Offset;
		float y = camera.GetPosition().y;	//сохраним координату y
		//если точка пересечения на полигоне
		if (Triangle.InsidePolygon(Intersection)) { //||
			//смещение
			Offset = GetCollisionOffset(normal, sphere.GetRadius(), distance) / camera.GetSpeed();
			//новая позиция камеры
			camera.SetPosition(Position + Offset);
			v = camera.GetPosition();
			v.y = y;	//восстановим читобы камеру не выворачивало
			camera.SetPosition(v);
			v = camera.GetDirection();
			v += Offset;
			v.y = 0;
			v.Normalize();
			//новое направление камеры
			camera.SetDirection(v);
		}
		//если сфера пересеклась с полигоном
		if (EdgeSphereCollision(sphere, Triangle)) {
			Offset = GetCollisionOffset(normal, sphere.GetRadius(), distance) / camera.GetSpeed();
			//новая позиция камеры
			camera.SetPosition(Position + Offset);
			v = camera.GetDirection();
			v.y = 0;
			v += Offset;
			//новое направление камеры
			camera.SetDirection(v);

		}
	}
вот что качается столкновений.
что скажешь? что может быть неправильно?
если нужен еще код скажи.
Спасибо заранее.
С Уважением Андрей
Прошу Оценить Octree-дерево + столкновения23 дек. 200520:56#46
BUzer
вот класс Frustum:
расчет fruxtum стандартный из примера NeHe
//Усеченная пирамида видимости
//Данная реализация с народного учебника по OpenGL
class Frustum  {
private:
	Plane leftPlane;	//левая плоскость отсечения пирамиды видимости
	Plane rightPlane;	//правая плоскость отсечения пирамиды видимости
	Plane topPlane;		//верхняя плоскость отсечения пирамиды видимости
	Plane bottomPlane;	//нижняя плоскость отсечения пирамиды видимости
	Plane nearPlane;	//ближняя плоскость отсечения пирамиды видимости
	Plane farPlane;		//дальняя плоскость отсечения пирамиды видимости
public:
...
	//проверка нахождения бокса в пирамиде видимости
	INLINE int BoundingBoxInFrustum(const AABB& Box) const
	{
		//если точка перед плоскостью считать весь BoundingBox в пиамиде видимости
		if (leftPlane.classifyPoint(Box.GetMaxPoint()) == Plane::FRONT_PLANE)
			return true;
		if (leftPlane.classifyPoint(Box.GetMinPoint()) == Plane::FRONT_PLANE)
			return true;
		if (leftPlane.classifyPoint(Box.GetMinPoint().x, Box.GetMaxPoint().y, Box.GetMinPoint().z) == Plane::FRONT_PLANE)
			return true;
		if (leftPlane.classifyPoint(Box.GetMinPoint().x, Box.GetMinPoint().y, Box.GetMaxPoint().z) == Plane::FRONT_PLANE)
			return true;
		if (leftPlane.classifyPoint(Box.GetMinPoint().x, Box.GetMaxPoint().y, Box.GetMaxPoint().z) == Plane::FRONT_PLANE)
			return true;
		if (leftPlane.classifyPoint(Box.GetMaxPoint().x, Box.GetMinPoint().y, Box.GetMinPoint().z) == Plane::FRONT_PLANE)
			return true;
		if (leftPlane.classifyPoint(Box.GetMaxPoint().x, Box.GetMaxPoint().y, Box.GetMinPoint().z) == Plane::FRONT_PLANE)
			return true;
		if (leftPlane.classifyPoint(Box.GetMaxPoint().x, Box.GetMinPoint().y, Box.GetMaxPoint().z) == Plane::FRONT_PLANE)
			return true;
		if (rightPlane.classifyPoint(Box.GetMaxPoint()) == Plane::FRONT_PLANE)
			return true;
		if (rightPlane.classifyPoint(Box.GetMinPoint()) == Plane::FRONT_PLANE)
			return true;
		if (rightPlane.classifyPoint(Box.GetMinPoint().x, Box.GetMaxPoint().y, Box.GetMinPoint().z) == Plane::FRONT_PLANE)
			return true;
		if (rightPlane.classifyPoint(Box.GetMinPoint().x, Box.GetMinPoint().y, Box.GetMaxPoint().z) == Plane::FRONT_PLANE)
			return true;
		if (rightPlane.classifyPoint(Box.GetMinPoint().x, Box.GetMaxPoint().y, Box.GetMaxPoint().z) == Plane::FRONT_PLANE)
			return true;
		if (rightPlane.classifyPoint(Box.GetMaxPoint().x, Box.GetMinPoint().y, Box.GetMinPoint().z) == Plane::FRONT_PLANE)
			return true;
		if (rightPlane.classifyPoint(Box.GetMaxPoint().x, Box.GetMaxPoint().y, Box.GetMinPoint().z) == Plane::FRONT_PLANE)
			return true;
		if (rightPlane.classifyPoint(Box.GetMaxPoint().x, Box.GetMinPoint().y, Box.GetMaxPoint().z) == Plane::FRONT_PLANE)
			return true;

		return false;
	}
};
как видишь я использую только 2 плоскости, если задействовать другие это приводит к тому что AABB узла всегда виден
и рисуются все полигоны :(
Это касается рендеринга Octree и FPS.
Прошу Оценить Octree-дерево + столкновения23 дек. 200520:56#45
BUzer
Итак Octree строю как обычно.
проходим по списку полигонов если полигон попадает узел, то туда его заношу сразу помечаю этот полигон как использованный
(чтобы не было дублей);
если в узле меньше 100 полигонов - этот узел лист(нет потомков) создаю под него память и увеличиваю число узлов.
если мы прошли по всем полигонам то заканчиваю построение дерева.
при рендеринге реурсивно хожу по всем дочерним узлам дерева, проверяю видимость BBox'а узла относительно frustum
если видим то рекурсивно спускаюсь вниз.
полигоны огтчортированы по материалам.
в узле храниться static переменная массива материалов.
и массив поверхностей.
поверхность - это:
1) масссив полигонов.Массив нужен для проверки столкновений и как средство отображения для старых карт,
не поддерживающих расширения OpenGLб для Direct3D это не применятеься там у меня все через Vertex Buffer.
массив полигонов и вершинные буфепы отсортированы по материалам.
2) массив вершинных буферов;
5) индекс материала.
я думаю ошибка у меня в корректном отсечении AABB узлов дерева по frustum а делаю я это так:
для начала вот класс AABB:
...
#define INLINE __forceinline
...
//Класс AABB (Axis-Aligned Bounding Box)
class AABB {
private:
	//Размер
	Vector3D size;
	//Максимальная точка
	Vector3D maxPoint;
	//Минимальная точка
	Vector3D minPoint;
public:
	//стандарные методы добавить вершину и возвратить MinPoint и MaxPoint
};
тепрерь так я представляю плоскость в пространтсnве:
...
#define INLINE __forceinline
...
class Plane  {//Плоскость в 3-мерном пространстве a*x + b*y + c*z + d = 0
	private:
		//Дистанция по нормале от начала координат
		float dist;
		//Нормаль к плоскости
		Vector3D normal;
	public:
	//Перед плоскостью, За плоскостью , На плоскости, Пересечение плоскости
	enum {FRONT_PLANE = 1, BACK_PLANE = -1, IN_PLANE = 2, INTERSECT_PLANE = 0};
	//классификация точки по отношению к плоскости
	INLINE int classifyPoint(const Vector3D& point) const
	{
		//Растояние от точки до плоскости с учетом знака
		float Dist = dotProduct(point, normal) + dist;
		if (Dist > EPS)
			//Перед плоскостью
			return FRONT_PLANE;
		if (Dist < EPS)
			//сзади плоскости
			return BACK_PLANE;
		//на плоскости
		return INTERSECT_PLANE;
	}
Прошу Оценить Octree-дерево + столкновения23 дек. 200519:39#44
BUzer
выложить кусок кода с комментариями? поможешь? просто не могу въехать...
Прошу Оценить Octree-дерево + столкновения23 дек. 200515:06#42
BUzer
>Хы, через "прямой рендеринг" у меня fps больше, чем через октри..
ну это иногда бываает.
а на середине сцены? вот на большом уровне это заметно что в Octree Fps больше.
>Столкновения глючат невероятно - у меня аж камеру перевернуло - так и летал потом вверх тормашками :)
да есть такой момент. Это если смотреть не апраллецно земле т.е. когда вектор direction не параллен плоскости x0z
а как это можно исправить? Я переделал пример с www.gametutorilas.com
>К слову, зачем строить октри при запуске игры? Это-же можно сразу в файл сохранить..
да это правильно но формат файла нужно усложнять...
В общем спасибо за тест.
Всем кому интересна разработка игровых движков!23 дек. 20054:11#25
Whiskey
Зашел наконец...
вот как увидел к примеру...
TObj = class
// положение обекта, его координаты
X, Y: ShortInt;
// constructor
constructor Create(tx, ty: ShortInt);
End;
{ TObj }
constructor TObj.Create(tx, ty: ShortInt);
begin
X := tx;
Y := ty;
end;
все бошьше не пойду!!!
Delphi в топку!!!
korak,
keltar,
DDMZ,
Andrey,
Executor,
Badim,
Arthur,
zeden,
deadok,
Vovanchic,
akaAngeL,
true :)))))
Проблемы с обменом значений между C/C++ и Lua.23 дек. 20054:02#0
Привет всем!!
добрался я наконец до Lua. Что скажу простой и быстрый язык. Несложное Api.
Единственным недостатком, то что мне не понравилось сложный обмен данными из Lua -> С/C++ и С/С++ -> Lua.возможно из-за
того, что пока c этим не разобрался.
Обмен немного заморочен иp-за стека Lua и его таблиц.
итак я хочу сделать тестовую программу которая просто меняет несколько переменных в цикле,
Пусть эти переменные являются например положением игрового объекта.
Я хочу чтобы скрипт менял их по определенному закону.
но если делать это в цикле, то выводяться одни и те-же значения
вот код, взятый с примера:
//открыть состояния Lua
lua_State *state = lua_open();
const luaL_reg lualibs[] = {
	//базовая бибилиотека
       { "base",       luaopen_base },
	//таблицы
       { "table",      luaopen_table },
	//стандатрынй ввод/вывод
       { "io",         luaopen_io },
	//строки
       { "string",     luaopen_string },
	//математика
        { "math",       luaopen_math },
	{"math.random", luaopen_math },
	{"math.sin",	luaopen_math },
	{"math.cos",	luaopen_math },
	{"math.tan",	luaopen_math },
	{"math.sqrt",	luaopen_math },
	{"math.pow",	luaopen_math },
	//отладочная бибилиотека
        { "debug",      luaopen_debug },
        { "loadlib",    luaopen_loadlib },
        { NULL,         NULL }
	};
	//открытие бибилиотек
const luaL_reg *lib;
for(lib = lualibs; lib->func; lib++) {
	lib -> func(state); /* Open the library */
       /*
       * Flush the stack, by setting the top to 0, in order to
       * ignore any result given by the library load function.
       */
lua_settop(state, 0);
//загрузить скрипт
int status = luaL_loadfile(state, "args.lua");
//создание таблицы и помещение ее в стек
lua_newtable(state);
// установка первого элемента значениме 45
lua_pushnumber(state, 0);
lua_pushnumber(state, 45);
lua_rawset(state, - 3);
//установука глобальной переменной в скрипте по имени
lua_setglobal(state, "arg") ;
//защищиенный вызов функции
status = lua_pcall(state, 0, LUA_MULTRET, 0);
//получаем вершину стека
status = lua_gettop(state);
while (status) { //пока стек не пуст
	//разбор возвращаемого из скрипта типа данных
	switch (lua_type(state, status)) {
		case LUA_TNUMBER:
			fprintf(stderr, "script returned %d%s" lua_tonumber(state, status), "\n";
		break;
		case LUA_TTABLE:
			fprintf(stderr, "script returned a table\n");;
		break;
		case LUA_TSTRING:
			fprintf(stderr, "script returned %s%s", lua_tostring(state, status), "\n");
		break;
		case LUA_TBOOLEAN:
			fprintf(stderr, "script returned %d%s", lua_toboolean(state, status), "\n");
		break;
		default:
			fprintf(stderr, "script returned unknown param\n");
	}
	//выталкиваем из стека полученное згачение.
	lua_pop(state, 1);
	status = lua_gettop(state);
}
//закрыть состояние Lua
lua_close( state );
вот сам скрипт:
local dt = {}	--локальная переменная
--цикл по таблице
for i=0,table.getn(arg) do
	dt[i] = arg[i]	--получаем значения из таблицы
end
return 2 * dt[0]	--возврат значения умноженного на 2
тут все понятно. значение выдается правильно.
теперь я хочу в цикле обмениваться данными.
я сделал так:
float num = 0.0f;//переменная
while (1) {	//эксперементальный цикл
	//получить верхушку стека
	status = lua_gettop(state);
	while (status) { //пока стек не пуст
	//разбор возвращаемого из скрипта типа данных
		switch (lua_type(state, status)) {
			case LUA_TNUMBER:
					num = static_cast<float>(lua_tonumber(state, status));
					fprintf(stderr, "script returned %f%s" num, "\n";
			break;
			case LUA_TTABLE:
				fprintf(stderr, "script returned a table\n");;
			break;
			case LUA_TSTRING:
				fprintf(stderr, "script returned %s%s", lua_tostring(state, status), "\n");
			break;
			case LUA_TBOOLEAN:
				fprintf(stderr, "script returned %d%s", lua_toboolean(state, status), "\n");
			break;
			default:
				fprintf(stderr, "script returned unknown param\n");
		}
		//выталкиваем из стека полученное значение.
		lua_pop(state, 1);
		//получить верхушку стека
		status = lua_gettop(state);

	}
	//выдать значение верхушки стека
	fprintf(stderr, "%s%d%s", "\n", lua_gettop(state), "\n");
	//проверить вместимость в стек очередного элемента
	if (lua_checkstack(state, 1))
		lua_pushnumber( state, num);//занести новое значение
	//установить текущей индекс
	lua_settop(state, 1);

}
//закрыть состояние Lua
lua_close( state );
почему переменная num не менят значение?
что я делаю не так?
Я так понимаю надо как-то  устанавливать верхушку стека для занесения новых значений?
или еще что нибудь?
boost::luabind и т.д. не предлагать, я пока хочу вникнуть на низком уровне. Wrapper'ы потом.

Спасибо овсем заранее.
С Уважением Андрей.

Прошу Оценить Octree-дерево + столкновения22 дек. 200512:32#40
All
пожалуйста протестируйте, мне очень нужны результаты оптимизации
Прошу Оценить Octree-дерево + столкновения21 дек. 200519:22#39
Entity
Закинул большой уровень.
All
сделаны улучшения по оптимизации. Есть статистика вывода полигонов. Смотрите пост 0

Правка: 21 дек. 2005 19:23

Протестите движок и вопрос о shadow cubemap.20 дек. 200514:14#2
AST
а скриншоты впечатляют!!!
Протестите движок и вопрос о shadow cubemap.20 дек. 200514:11#1
AST
Слушай, а модельку можешь на почту скинуть???
протестить не могу скорость маленькая, боюсь не закачаю :(

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

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