Проблема в следующем. Нашел работающий пример с этим алгоритмом http://www.wheatchex.com/projects/viz2001/01_mcubes/code/opengl-mcubes.cpp переделал под данные в виде 3хмерного массива, но в примере нормали рассчитываются через градиент, с моими данными не работает. И я никак не могу сообразить как переделать. Кто может - помогите.
Asteroid И что? Там ведь данные генерятся по формуле - можно использовать градиент. А у меня набор статический и градиент считать - а на фига? Нормаль сразу получиь и делов. Вот только никак не могу понять, чтож такое в vGetNormal передается и как это использовать для рассчета нормали
Member
Статус: Не в сети Регистрация: 30.01.2003 Откуда: Москва
Ок...наверное я чего-то не понимаю Там есть vSetTime, в которой динамически изменяются данные в sSourcePoint. Может быть там подставить твои данные и оставить все остальное как есть?
Asteroid И так, давай разберем оригинальны код. Это демонстрашка работы алгоритма бегущих кубиков и тетраэдров(?). Эти алгоритмы предназначены для полигонизации поверхностей (т.е. вычисляют и разбивают произвольную поверхность на элементарные полигоны, которые уже можно выводить средствами компьютерной 3Д графики). Далее, мне этот алгоритм нужен чтобы отрисовать изоповерхность (поверзность одного уровня). Мои данные представляют собой просто 3хмерный массив, куб, в котором распределена энергия различных значений. В оригинальном коде для генерации данных используются функции (fSamlpe1-4), и нормаль вычисляется как градиент (подставил значение на предыдущем шаге, потом на следующем, вычел и получил градинет, его используют как нормаль). Тут данные заданы аналитически. У меня же данные статичные, то есть никак со временем не меняются. И что-то я никак не могуу понять, что ж там в vGetNormal передается, и как из этого можно посчитать нормали.
Вроде так.
Member
Статус: Не в сети Регистрация: 30.01.2003 Откуда: Москва
Угу (Бегущие тетраэдры - это бесплатный вариант патентованных бекущих кубиков)
Все, я тормоз Понял, к чему там fSamples и vSetTime...
Пойдем так
Код:
//Make a local copy of the values at the cube's corners for(iVertex = 0; iVertex < 8; iVertex++) { afCubeValue[iVertex] = fSample(fX + a2fVertexOffset[iVertex][0]*fScale, fY + a2fVertexOffset[iVertex][1]*fScale, fZ + a2fVertexOffset[iVertex][2]*fScale); }
Ты заполняешь afCubeValue своими данными, каким-то образом интрерполируя из имеющихся - так? Если так, то вроде нормально, т.к. из afCubeValue высчитывается fOffset, а из него все остальное...
Добавлено спустя 6 часов, 55 минут, 52 секунды: Еще одна мысля. Для каждой найденной точки мы знаем, в каком мы кубике и знаем значения энергий в его вершинах. Тогда для каждой данной точки надо интреполировать разности энергий (оно же градиенты) между вершинами по X, Y и Z. Вектор нормали получается, если сложить вектора x, y, и z с весами из полученнных разностей (и нормализовать).
Вроде должно сработать: нормаль на изоповерхности должна смотреть в сторону наиболее быстро убывающего вектора энергии.
Что-то я не проникся твоей мыслью... Вот пример FTP://82.117.64.190/incoming/4OC/mc.exe , посмотри, может что подскажешь. В нем сначала зажми правую нопку мыши и вниз протащи чуток. А бегунком справа - меняется уровень желаемой изоповерхности.
Этот сэмпл используется в vGetNormal. В сам vGetNormal подаются координаты точек на ребрах куба (которые образуют треугольники поверхности), в этих точка считается градиент - и из него нормаль.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения