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

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

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

Регистрация: May 2001
Адрес: Москва
Сообщений: 670
ну начнем с паролельного переноса , для приведения произвольной камеры к стандартной. почему там к кординатам объектов плюсуеются координаты камеры??? рисовал на бумаге - получается должно минусоваться.

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

Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
Может немного поможет ...

http://algolist.manual.ru/graphics/3...rticles/25.php

я если честно не понял сути твоего вопроса, давно я уже с 3D не возился, больше года наверно.

Насколько я помню, вначале мы вычисляем матрицу трансформаций произвольной камеры, перемножаем её на все вектора обьекта и ещё вычитаем из координат объекта центр камеры - фокусное расстояние, что-то такое ... голова плохо соображает =)


Ща пороюсь в своих исходниках ...
__________________
flash/flex/unity

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

Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
Вот так вычисляються вектора камеры ...
Код:
basisc = to.operator_subtraction (from).Normalize ();
basisa = up.CrossProduct (basisc).Normalize ();
basisb = basisc.CrossProduct (basisa);
Потом перебираем все вектора и преобразовываем:

Код:
for (var i = 0; i < v.length; i++)
	{
		var t:Vector3f = v[i].operator_subtraction (from);
		finalCameraMatrix.TransformVector (t);
		t.z -= distance;
		var perspective_ratio:Number = 1.0 / (t.z / distance + 1.0);
		v[i].rx = center.x + t.x * perspective_ratio;
		v[i].ry = center.y - t.y * perspective_ratio;
	}
Как видишь - у меня они вычитаються (operator_subtraction).

Могу исходники скинуть, если надо конечно.
__________________
flash/flex/unity

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

Регистрация: May 2001
Адрес: Москва
Сообщений: 670
а вот это не помнишь???

// прототип преобразования сдвига
vertex.prototype.transpose = function(incX, incY, incZ) {
this.x += incX;
this.y += incY;
this.z += incZ;
};

да и тот код что ты написал в предыдущем посте непонятен, ибо надо исходник смотреть ) так что конечно выкладывай.

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

Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
Вот я давненько делал пример камеры несложный, без наворотов так сказать:

Код:
_quality = "LOW";
import org.nuran.math.types.Vector3f;
import org.nuran.math.types.Matrix3f;
function lookAt ():Void
{
	basisc = to.operator_subtraction (from).Normalize ();
	basisa = up.CrossProduct (basisc).Normalize ();
	basisb = basisc.CrossProduct (basisa);
}
function updateAnimation ():Void
{
	lookAt ();
	finalCameraMatrix.e = [basisa.Array (), basisb.Array (), basisc.Array ()];
	for (var i = 0; i < v.length; i++)
	{
		var t:Vector3f = v[i].operator_subtraction (from);
		finalCameraMatrix.TransformVector (t);
		t.z -= distance;
		var perspective_ratio:Number = 1.0 / (t.z / distance + 1.0);
		v[i].rx = center.x + t.x * perspective_ratio;
		v[i].ry = center.y - t.y * perspective_ratio;
	}
	clear ();
	lineStyle (0, 0xffffff, 100);
	//
	moveTo (v[0].rx, v[0].ry);
	lineTo (v[1].rx, v[1].ry);
	lineTo (v[2].rx, v[2].ry);
	lineTo (v[3].rx, v[3].ry);
	lineTo (v[0].rx, v[0].ry);
	//
	moveTo (v[5].rx, v[5].ry);
	lineTo (v[4].rx, v[4].ry);
	lineTo (v[3].rx, v[3].ry);
	lineTo (v[2].rx, v[2].ry);
	lineTo (v[5].rx, v[5].ry);
	//
	moveTo (v[4].rx, v[4].ry);
	lineTo (v[5].rx, v[5].ry);
	lineTo (v[6].rx, v[6].ry);
	lineTo (v[7].rx, v[7].ry);
	lineTo (v[4].rx, v[4].ry);
	//
	moveTo (v[7].rx, v[7].ry);
	lineTo (v[6].rx, v[6].ry);
	lineTo (v[1].rx, v[1].ry);
	lineTo (v[0].rx, v[0].ry);
	lineTo (v[7].rx, v[7].ry);
	//
	moveTo (v[0].rx, v[0].ry);
	lineTo (v[3].rx, v[3].ry);
	lineTo (v[4].rx, v[4].ry);
	lineTo (v[7].rx, v[7].ry);
	lineTo (v[0].rx, v[0].ry);
	//
	moveTo (v[6].rx, v[6].ry);
	lineTo (v[5].rx, v[5].ry);
	lineTo (v[2].rx, v[2].ry);
	lineTo (v[1].rx, v[1].ry);
	lineTo (v[6].rx, v[6].ry);
	//
	// Draw axes.
	//
	lineStyle (0, 0xff0000, 100);
	moveTo (v[8].rx, v[8].ry);
	lineTo (v[9].rx, v[9].ry);
	//
	lineStyle (0, 0x00ff00, 100);
	moveTo (v[10].rx, v[10].ry);
	lineTo (v[11].rx, v[11].ry);
	//
	lineStyle (0, 0x0000ff, 100);
	moveTo (v[12].rx, v[12].ry);
	lineTo (v[13].rx, v[13].ry);
}
var rad:Number = Math.PI / 180.0;
var center:Vector3f = new Vector3f (375.0, 200.0, .0);
var origin:Vector3f = new Vector3f (.0, .0, .0);
var distance:Number = 500.0;
var sx:Number = 100.0;
var sy:Number = 100.0;
var sz:Number = 100.0;
var v:Array = new Array ();
v[0] = new Vector3f (sx, -sy, sz);
v[1] = new Vector3f (sx, sy, sz);
v[2] = new Vector3f (sx, sy, -sz);
v[3] = new Vector3f (sx, -sy, -sz);
v[4] = new Vector3f (-sx, -sy, -sz);
v[5] = new Vector3f (-sx, sy, -sz);
v[6] = new Vector3f (-sx, sy, sz);
v[7] = new Vector3f (-sx, -sy, sz);
var sx:Number = 300.0;
var sy:Number = 300.0;
var sz:Number = 300.0;
v[8] = new Vector3f (sx, .0, .0);
v[9] = new Vector3f (-sx, .0, .0);
v[10] = new Vector3f (.0, sy, .0);
v[11] = new Vector3f (.0, -sy, .0);
v[12] = new Vector3f (.0, .0, sz);
v[13] = new Vector3f (.0, .0, -sz);
var finalCameraMatrix:Matrix3f = new Matrix3f ();
var basisa:Vector3f = new Vector3f (.0, .0, .0);
var basisb:Vector3f = new Vector3f (.0, .0, .0);
var basisc:Vector3f = new Vector3f (.0, .0, .0);
var from = new Vector3f (80.0, 200.0, -distance);
var up = new Vector3f (.0, 1.0, .0);
var to = new Vector3f (.0, .0, .0);
updateAnimation ();
onEnterFrame = function ()
{
	var f:Function = Key.isDown;
	if (f (81))
	{
		Vector3f.TranslateAxis (from, -15, basisc);
		updateAnimation ();
	}
	if (f (69))
	{
		Vector3f.TranslateAxis (from, 15, basisc);
		updateAnimation ();
	}
	if (f (65))
	{
		Vector3f.RotateAxis (from, 2 * rad, basisb, to);
		updateAnimation ();
	}
	if (f (68))
	{
		Vector3f.RotateAxis (from, -2 * rad, basisb, to);
		updateAnimation ();
	}
	if (f (87))
	{
		Vector3f.RotateAxis (from, 2 * rad, basisa, to);
		updateAnimation ();
	}
	if (f (83))
	{
		Vector3f.RotateAxis (from, -2 * rad, basisa, to);
		updateAnimation ();
	}
	if (f (Key.LEFT))
	{
		Vector3f.RotateY (to, 2 * rad, from);
		updateAnimation ();
	}
	if (f (Key.RIGHT))
	{
		Vector3f.RotateY (to, -2 * rad, from);
		updateAnimation ();
	}
	if (f (Key.UP))
	{
		Vector3f.RotateAxis (to, 2 * rad, basisa, from);
		updateAnimation ();
	}
	if (f (Key.DOWN))
	{
		Vector3f.RotateAxis (to, -2 * rad, basisa, from);
		updateAnimation ();
	}
};

СОбственно сама камера в данном слычае - это набор 2-х точек (вектора взгляда) и вектора "вверх".

from = new Vector3f (80.0, 200.0, -distance);
up = new Vector3f (.0, 1.0, .0);
to = new Vector3f (.0, .0, .0);

Функция lookAt - вычисляет новые вектора камеры в соответствии с направляющим вектором и вектором "вверх".

v - массив с векторами.
__________________
flash/flex/unity

Старый 07.07.2005, 13:22
nuran вне форума Посмотреть профиль Отправить личное сообщение для nuran Найти все сообщения от nuran
  № 16  
Ответить с цитированием
nuran

Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
ща выложу ...
__________________
flash/flex/unity

Старый 07.07.2005, 13:28
nuran вне форума Посмотреть профиль Отправить личное сообщение для nuran Найти все сообщения от nuran
  № 17  
Ответить с цитированием
nuran

Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
вот исходник ... =\
Вложения
Тип файла: zip nuran.org_targetCamera_.zip (21.5 Кб, 43 просмотров)
__________________
flash/flex/unity

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

Регистрация: May 2001
Адрес: Москва
Сообщений: 670
ты забыл org.nuran.math.types.Quaternion

Старый 07.07.2005, 16:22
nuran вне форума Посмотреть профиль Отправить личное сообщение для nuran Найти все сообщения от nuran
  № 19  
Ответить с цитированием
nuran

Регистрация: Apr 2003
Адрес: DC
Сообщений: 4,489
По умолчанию org.nuran.math.types.Quaternion

org.nuran.math.types.Quaternion
Вложения
Тип файла: zip Quaternion.zip (2.6 Кб, 39 просмотров)
__________________
flash/flex/unity

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

Регистрация: May 2001
Адрес: Москва
Сообщений: 670
пример супер, но
Цитата:
без наворотов так сказать
)))
мне еще проще надо(

может помнишь и так ответишь?
вобщем с переносом мы определились

var x:Number=point.x-camera.x;
var y:Number=point.y-camera.y;
var z:Number=point.z-camera.z;

поворот (возьмер по горизонтали, вокруг Y)
ну вроде тоже все правельно ???

var __x:Number = x*Math.cos(camera.R*rad)+z*Math.sin(camera.R*rad);
var __y:Number = y;
var __z:Number = -x*Math.sin(camera.R*rad)+z*Math.cos(camera.R*rad);
//camera.R - куда смотрит камера, угол от 0 до 359

а вот с проецированием возникают проблемы (
стандатная формула не подходит
sx = cnx+__x*dist/(z+dist);
sy = cnx-__y*dist/(z+dist);
формула что в твоем примере
t.z -= distance;
var perspective_ratio:Number = 1.0 / (t.z / distance + 1.0);
v[i].rx = center.x + t.x * perspective_ratio;
v[i].ry = center.y - t.y * perspective_ratio;
просто получается куском кода выдернутым из контекста ((( и вставленным не в склад не в лад (
и это конечно не удивительно .

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

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

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


 


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


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