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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.02.2012, 20:18
Samuel_D вне форума Посмотреть профиль Отправить личное сообщение для Samuel_D Найти все сообщения от Samuel_D
  № 1  
Ответить с цитированием
Samuel_D

Регистрация: Aug 2010
Сообщений: 18
По умолчанию Псевдо 3D

Приветствую всех форумчан.

В процессе создания игры с использованием псевдо 3d, назрел вопрос следующего характера : во время движения объекты расположенные на большом расстоянии движутся быстрее чем объекты расположенные поблизости, как избавится от этого недуга ?

Опишу логику, которую использую для перемещения объектов:
Код AS3:
var groundObject:MovieClip = new GroundObject();  // объект, двигающийся навстречу 
var objPosition:Object = {x_pos:0,y_pos:0,z_pos:300};// расположение объекта на псевдо 3d сцене
var zPosOfCamera:Number = 0; // расположение камеры, которая начнет "двигаться" вперед в  ENTER_FRAME
// далее следует метод, который я вызываю в ENTER_FRAME
// он выполняет перемещение объекта
// DITANCE_TO_HORIZONT - константа, описывающая расстояние до горизонта
// 
function move():void
{
   // расстояние от камеры до объекта
    var dz:Number = objPosition.z_pos - zPosOfCamera;
    // определяю scale для объекта исходя из расположения его по оси Z относительно камеры
    // как мне кажется это и есть моя проблема, т.к. я получаю линейную зависимость
     var scale:Number = ( DITANCE_TO_HORIZONT - dz) / DITANCE_TO_HORIZONT;
     groundObject.x = objPosition.x_pos * scale;
     groundObject.y = objPosition.y_pos * scale;
     groundObject.scaleX = groundObject.scaleY = scale;
     zPosOfCamera += 1;
}
пример упрощен, по сравнению с приложением, т.к. в рабочем коде очень много лишнего(не касающегося текущей проблемы).

Возможно кто-то сталкивался с такой проблемой или использовал другую логику ? подскажите как исправить ситуацию.

Не смог прикрепить swf-ку, поэтому выложил сюда

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

Регистрация: Nov 2010
Сообщений: 150
Попробуйте так
Код AS3:
var scale:Number = DITANCE_TO_HORIZONT / ( DITANCE_TO_HORIZONT + dz);
Добавлено через 8 минут
Код AS3:
var pos3d:Vector3D = new Vector3D(5,7,8);
	var minX:Number = 0;
	var minY:Number = 0;
	var width:Number = 640;
	var height:Number = 480;
	var cx:Number = width * 0.5;
	var cy:Number = height * 0.5;
	var distance:Number = 500;
	var pos2d:Point = new Point(((pos3d.x + cx) * distance + cx * pos3d.z) / (d + pos3d.z) + minX,
					((height - pos3d.y) * distance + cy * pos3d.z) / (d + pos3d.z) + minY);
А это преобразование координат для перспективной проекции (собственно для вашего случая), ось X получается направлена слева-право, ось Y снизу-вверх.

Старый 08.02.2012, 18:10
Samuel_D вне форума Посмотреть профиль Отправить личное сообщение для Samuel_D Найти все сообщения от Samuel_D
  № 3  
Ответить с цитированием
Samuel_D

Регистрация: Aug 2010
Сообщений: 18
спасибо, Stitch512.

Но я пошел другим образом
Код AS3:
var groundObject:MovieClip = new GroundObject();  // объект, двигающийся навстречу 
var objPosition:Object = {x_pos:0,y_pos:0,z_pos:300};// расположение объекта на псевдо 3d сцене
var zPosOfCamera:Number = 0; // расположение камеры, которая начнет "двигаться" вперед в  ENTER_FRAME
// далее следует метод, который я вызываю в ENTER_FRAME
// он выполняет перемещение объекта
// DITANCE_TO_HORIZONT - константа, описывающая расстояние до горизонта
// 
function move():void
{
   // расстояние от камеры до объекта
    var dz:Number = objPosition.z_pos - zPosOfCamera;
    // определяю scale для объекта исходя из расположения его по оси Z относительно камеры
    // как мне кажется это и есть моя проблема, т.к. я получаю линейную зависимость
     var scale:Number = 20/dz;  // чило 20 было получено опытным путем, что не есть гуд, но,      
                                          // к сожалению, работает
     groundObject.x = objPosition.x_pos * scale;
     groundObject.y = objPosition.y_pos * scale;
     groundObject.scaleX = groundObject.scaleY = scale;
     zPosOfCamera += 1;
}
вот результат

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

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

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


 


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


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