Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.03.2013, 21:36
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 11  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Колдовство с мешем и подбор подходящих текстур на SkyBox позволили добиться хороших результатов с цилиндрической ногой:
Название: planar_reflection.jpg
Просмотров: 380

Размер: 53.4 Кб
К сожалению, она до сих пор не хочет отражаться в нижней плоской ноге.
Игра с reflectionTexture.position не приводит к появлению отражения. Asfel, не могли бы вы рассказать подробней про
Цитата:
Нужно отрендерить ножку на плоскую текстуру, затем положить ее как планар рефлек на подножку. Для ножки отрендерить куб который находится гораздо ближе к ножке либо плоскую стену %)
?

Старый 06.03.2013, 20:51
Asfel вне форума Посмотреть профиль Отправить личное сообщение для Asfel Найти все сообщения от Asfel
  № 12  
Ответить с цитированием
Asfel

Регистрация: Feb 2013
Адрес: Киев
Сообщений: 76
Отправить сообщение для Asfel с помощью Skype™
Про рендер ножки на текстуру:
Я имел ввиду взять и отрендерить ее на текстуру отдельно от сцены, а получившуюся текстуру использовать в PlanerReflectionMethod. Хотя тут посути ножка и так должна была бы быть видна раз видно стол с низу, хотя может она просто не попадает в отражение, но раз вы говорите что изменение позиции центра отражения ничего не дали то видимо нет...

Про куб для ножки. Это я имел ввиду взять куб, на его стороны отрендерить сцену самостоятельно либо просто взять текстуры скайбокса, куб сделать маленького размера и расположить вокруг ножки. Затем отрендерить на ножку окружение т.е куб и в таком случае отражение сцены было бы как бы более стянутым, но вы этого эффекта и так добились .

Кстати то что с ножкой, чтобы именно вот так только 1 объект было не видно с таким я не сталкивался, но могу посоветовать попробовать материал отобразить на спрайте или плейне(от поднокжи) чтобы посмотреть рендерится ли ножка вообще на нем

Старый 06.03.2013, 21:44
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 13  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Мне удалось добиться отражения цилиндрической ножки в нижней плоской ноге:
Название: planar_reflection_plane_geometry.JPG
Просмотров: 383

Размер: 41.8 Кб
Здесь я использовал PlaneGeometry в сочетании с PlanarReflectionTexture, пример чего можно посмотреть в первом посте (там где R2D2 перед зеркалом ездит). И это мило и замечательно
Проблема только в том, что я не нашел как применить эту текстуру на круг, также как она применяется к плоскости. В исходниках я не нашел какого-нибудь CircleGeometry или чего-то подобного. Натягивание PlanarReflectionTexture на CylinderGeometry, к сожалению, не приносит желаемого результата.
Я попробовал добраться до vertexData плоскости, думал "Щас я как добавлю туда точек, и всего-то делов". Но не тут-то было.
Код AS3:
mesh.subMeshes[0].vertexData.splice(39, 0, 0, 100, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0);
Результат такой:
Название: planar_reflection_plane_geometry_02.JPG
Просмотров: 335

Размер: 41.3 Кб
То есть он просто игнорирует точки дальше четвертой:
Код:
mesh.subMeshes[0].vertexData = -50,-50,0,0,0,-1,1,0,0,0,1,0,0 | 50,-50,0,0,0,-1,1,0,0,1,1,0,0 | -50,50,0,0,0,-1,1,0,0,0,0,0,0 | 50,50,0,0,0,-1,1,0,0,1,0,0,0
mesh.subMeshes[0].numVertices = 4
// После добавления точки (методом splice)
mesh.subMeshes[0].vertexData = -50,-50,0,0,0,-1,1,0,0,0,1,0,0 | 50,-50,0,0,0,-1,1,0,0,1,1,0,0 | -50,50,0,0,0,-1,1,0,0,0,0,0,0 | 0,100,0,0,0,-1,1,0,0,0,0,0,0 | 50,50,0,0,0,-1,1,0,0,1,0,0,0
mesh.subMeshes[0].numVertices = 4
Попробовал дописать сеттер numVertices, чтобы как бы сказать "Парень, теперь у тебя пять точек", но это результата также не дало. Да, кстати, видно, что и в маленьком шаре ножка тоже не отражается. Хотя верхний параллелепипед с текстурой дерева вполне себе отражается.

Старый 11.03.2013, 14:12
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 14  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Нашел в исходниках объяснение значений в векторе vertexData:
Код:
/**
 * Updates the vertex data. All vertex properties are contained in a single Vector, and the order is as follows:
 * 0 - 2: vertex position X, Y, Z
 * 3 - 5: normal X, Y, Z
 * 6 - 8: tangent X, Y, Z
 * 9 - 10: U V
 * 11 - 12: Secondary U V
 */
public function updateData(data : Vector.<Number>) : void
{
    ...
}

Старый 11.03.2013, 17:50
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 15  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Ура, свершилось! Идея с добавлением вершин осталась старая. Просто я нашел таки способ их добавить. Он, конечно же, оказался прост и очевиден. Нужно было создавать PlaneGeometry с большим количеством сегментов. На эту мысль меня натолкнул пример здесь, там где идет описание примитива Plane. На демке с этой страницы можно видеть как строится примитив из треугольников.

Следующей задачей было выяснить как эти точки группируются в векторе vertexData. Группируются так (пример квадрата 50x50 с segV = 2 и segH = 2):
Название: explain.jpg
Просмотров: 376

Размер: 10.3 Кб Название: explain_02.jpg
Просмотров: 392

Размер: 11.4 Кб
Для большего количества сегментов группировка точек будет аналогична.
Получается чтобы превратить квадратную плоскость в правильный многоугольник нужно сдвинуть крайние точки квадрата на красную окружность. Чем и занимается следующая функция:
Код AS3:
/**
 * Функция меняет значения x, y, z в векторе v для крайних точек
 * плоскости. Предусловием является то, что созданная PlaneGeometry
 * должна быть вписана в круг радиуса r. Также количество сегментов
 * по вертикали должно совпадать с количеством сегментов по горизонтали.
 * @param	v
 * @param	r
 */
private function convertPlaneToCircle( v:Vector.<Number>, r:Number ):void
{
	// Выясняем количество сегментов.
	var segCount:int = Math.sqrt(v.length / 13) - 1;
	// Изобразим картинку для segCount = 3
 
	//  12   13    14   15
	//   o----o----o----o
	//   |    |    |    |
	// 8 o----o----o----o 11
	//   |    |    |    |
	// 4 o----o----o----o 7
	//   |    |    |    |
	//   o----o----o----o
	//  0     1    2     3
 
	// То есть нужно изменить положение точек с обозначенными
	// индексами. Помним, что по предусловию точки 0, 3, 12 и 15
	// (для данного случая) лежат на окружности радиуса r.
	// Остальным точкам нужно задать координаты таким образом, чтобы
	// они стали вершинами правильного многоугольника.
 
	// Сразу можно выяснить шаг угла.
	var angleStep:Number = (90.0 / segCount) / DEG_IN_RAD;
	var angle:Number = 0;
 
	var pointsCount:int = v.length / 13;
	for (var n:int = 0; n < pointsCount; ++n)
	{
		// Нас интересуют точки нижнего ряда
		if (n > 0 && n < segCount)
		{
			// Здесь начинается с угловой координаты -3 * pi / 4
			// и идет в сторону увеличения
			angle = ( -3 * Math.PI / 4) + n * angleStep;
			// Ставим x
			v[ n * 13 ] = Math.cos(angle) * r;
			// Ставим y
			v[ n * 13 + 1 ] = Math.sin(angle) * r;
		}
 
		// Еще нас интересуют точки верхнего ряда
		else if (n > (segCount * (segCount + 1)) && n < pointsCount - 1)
		{
			// Здесь начинается с угловой координаты 3 * pi / 4
			// и идет в сторону уменьшения
			angle = ( 3 * Math.PI / 4) - n * angleStep;
			v[ n * 13 ] = Math.cos(angle) * r;
			v[ n * 13 + 1 ] = Math.sin(angle) * r;
		}
 
		// Еще нас интересует левая сторона
		else if ((n % (segCount + 1)) == 0 && n > 0 && n < (segCount * (segCount + 1)))
		{
			// Здесь начинается с угловой координаты -3 * pi / 4
			// и идет в сторону уменьшения
			angle = ( -3 * Math.PI / 4) - int(n / (segCount + 1)) * angleStep;
			v[ n * 13 ] = Math.cos(angle) * r;
			v[ n * 13 + 1 ] = Math.sin(angle) * r;
		}
 
		// Еще нас интересует правая сторона
		else if ((n % (segCount + 1)) == segCount && n > segCount && n < pointsCount - 1)
		{
			// Здесь начинается с угловой координаты -pi / 4
			// и идет в сторону увеличения
			angle = ( -Math.PI / 4) + int(n / (segCount + 1)) * angleStep;
			v[ n * 13 ] = Math.cos(angle) * r;
			v[ n * 13 + 1 ] = Math.sin(angle) * r;
		}
	}
}
Стоит отметить, что я мог что-то напутать с расположением точек и знаю, что данная функция работает для количества сегментов равных 3 и 7. Меня цифра 7 удовлетворила вполне, поэтому дальше я не стал разбираться. Полагаю, можно допилить до работы с любым количеством сегментов.

Так вот, в общем мы просто меняем координаты точек и радуемся результату:
Название: planar_reflection_circle_geometry.JPG
Просмотров: 352

Размер: 42.2 Кб Название: planar_reflection_circle_geometry_02.JPG
Просмотров: 326

Размер: 43.8 Кб

Еще раз спасибо товарищам Asfel и vorodis2

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.