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

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

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

Регистрация: Dec 2005
Сообщений: 113
По умолчанию Веревка

Народ как делать веревку понятно(у Дембицкого в уроках хорошо написано).Вопрос в следующем: как сделать веревку фиксированого размера?У него там просто не веревка скорее резинка!

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

Регистрация: Feb 2002
Сообщений: 358
Отправить сообщение для F_Flash с помощью ICQ
Хороший вопрос%)

размер вревки это длина кривой. Для этого нам хотябы нужно ее научиться находить.

длина кривой вычисялется по фрмуле

http://ru.wikipedia.org/wiki/%D0%94%...B2%D0%BE%D0%B9


далее смотрим по какой формуле мы строим кривую если это бикубический сплайн(кривая безье) то есть топик

http://algolist.manual.ru/forum/show...036/page//vc/1


во флеше используется для пострениея кривых

http://people.nnov.ru/fractal/Splines/Bezier.htm


вот код для флеша
Код:
// quadratic bezier functions
function B1 (t) {
	return (t*t);
}
function B2 (t) {
	return (2*t*(1-t));
}
function B3 (t) {
	return ((1-t)*(1-t));
}

// draw spline routine : called from RedrawClip
function DrawSpline () {
	count = 0;
	// change this for smooth line
	detailBias = 1/23;
	level = 1;
	do {
		x = cP1._x*B1(count)+cP2._x*B2(count)+cP3._x*B3(count);
		y = cP1._y*B1(count)+cP2._y*B2(count)+cP3._y*B3(count);
		if (level>1) {
			attachMovie("line", "line"+level, level+10);
			_root["line"+level]._x = x;
			_root["line"+level]._y = y;
			_root["line"+level]._rotation = Math.atan2(yold-y, xold-x)*180/(Math.PI);
			_root["line"+level]._xscale = _root["line"+level]._yscale = Math.sqrt((xold-x)*(xold-x)+(yold-y)*(yold-y));
		}
		yold = y;
		xold = x;
		++level;
		count += detailBias;
	} while (count<=1);
}

// main init : put 3 control point to stage
for (i=1; i<=3; i++) {
	attachMovie("cdot", "cP"+i, i);
	_root["cP"+i]._x = random(540);
	_root["cP"+i]._y = random(400);
}
для вычисления длины я просто прибалял расстояния от точки до сдледущей точки аппроксимации.На выходе погрешнось зависит от количесва сегментов для апроксимации.

далее все зависит от того по каким параметрам ты хочешь построить кривую заданной длины. если анпример по трем точкам и длине так ее можно просто не дориосвывать. т.е. нкжно знать какие параметры функции построения ты быдешь передать кроме длины.


Последний раз редактировалось F_Flash; 24.07.2006 в 16:06.
Старый 24.07.2006, 17:21
tov_diatel вне форума Посмотреть профиль Отправить личное сообщение для tov_diatel Найти все сообщения от tov_diatel
  № 3  
Ответить с цитированием
tov_diatel

Регистрация: Dec 2005
Сообщений: 113
Ну для того что бы веревка была более менее реалистична необходимо как минимум точек пять имеющих вес!что бы она реалистично прогибалась!Кста спасибо за ответ ща буду смотреть че ты мне скинул!

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

Регистрация: Feb 2002
Сообщений: 358
Отправить сообщение для F_Flash с помощью ICQ
будем говорить так. Веревка это кривая второго порядка

ее нужно разбить на сегменты которые строятся из 3-х точек как во флеше. или из 2-х точек + 2х точек касательных.

Так вот общая длоина будет сложена из суммы длин этих сегменов.

для начала тебе нужно уметь просчитать длину одного сегмента. описал выше как это возможно.

далее поведение веревки

а)ты можешь сделать функцию стоб один конец у тебя был фиксированным. второй конец двигался за мышкой. тогда она у тебя будет прогинаться за счет длины(меняться будет точка касательных).
б) у тебя один конец фиксированный второй конец болтается на ветру тогда будет менять положение второй точки, а точка касательных будет задавать направление колебаний. в жэтом случае ты можешь ее просто нарисовать нужной длины по формулам quadratic bezier т.е. недорисовать или продлить на нужный кусок.


В любом случае ты должна определиться что у тябы будет постоянным а что нужэно достроить до той длины что необходима.

Старый 24.07.2006, 20:01
Iv вне форума Посмотреть профиль Отправить личное сообщение для Iv Посетить домашнюю страницу Iv Найти все сообщения от Iv
  № 5  
Ответить с цитированием
Iv
 
Аватар для Iv

Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
я далеко не уверен, что стоит лезть в такие дебри.
есть простые принципы инверсной кинематики,
которые здесь наверняка подойдут лучше,
по причине своей простоты относительно кривых.
вот код, как-то опубликованный Антоном Волковым
(но я тоже чего то там наэкскрементировал) :
Код:
this.createEmptyMovieClip("line", 1);
this.line.init = function(num, len) {
	this.len = len;
	this.point = [];
	for (var i = 0; i<num; i++) {
		var t = new Object();
		t.x = 0+i*20;
		t.y = 200;
		this.point.push(t);
	}
};
this.xstep = 0;
this.drag_x = 0;
this.ystep = 0;
this.drag_y = 0;
		this.target_x = Math.random()*Stage.width;
		this.target_y = Math.random()*Stage.height;
//
this.onEnterFrame = function() {
	if (!(random(20))) {
		this.target_x = Math.random()*Stage.width;
		this.target_y = Math.random()*Stage.height;
	}
	this.xstep += (this.target_x-this.drag_x)*0.005;
	this.xstep *= .95;
	this.drag_x += this.xstep;
	this.ystep += (this.target_y-this.drag_y)*0.005;
	this.ystep *= .95;
	this.drag_y += this.ystep;
	this.line.onUpdate(this.drag_x, this.drag_y);
};
this.line.onUpdate = function(x, y) {
	this.point[0].x = x
	// || this._xmouse;
	this.point[0].y = y
	// || this._ymouse;
	this.clear();
	this.lineStyle(0, 0, 100);
	this.moveTo(this.point[0].x, this.point[0].y);
	for (var i = 1, len = this.point.length; i<len; i++) {
		//[x1,y1] и [x2,y2] - координаты предыдущей и текущей точки соответственно
		var x1 = this.point[i-1].x, y1 = this.point[i-1].y;
		var x2 = this.point[i].x, y2 = this.point[i].y;
		// xd и yd - разница расстояний между точками
		var xd = x2-x1, yd = y2-y1;
		//dist - расстояние между точками
		var dist = Math.sqrt(xd*xd+yd*yd);
		//коррекция расстояния между точками до требуемого (через подобие)
		this.point[i].x = x1+(xd*this.len)/dist;
		this.point[i].y = y1+(yd*this.len)/dist;
		this.lineTo(this.point[i].x, this.point[i].y);
	}
};
//линия с 200 точками и расстоянием 5px между ними
this.line.init(200, 3);

Старый 24.07.2006, 20:13
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Упрощённый вариант (+гравитация и "ветер" (горизонтальная гравитация)):
Код:
this.createEmptyMovieClip("line", 1);
this.line.init = function(num, len) {
	this.len = len;
	this.point = [];
	for (var i = 0; i<num; i++) {
		var t = new Object();
		t.x = 0+i*20;
		t.y = 200;
		this.point.push(t);
	}
};
this.line.onEnterFrame = function() {
	this.gravity = 10;
	this.wind = 2;
	this.point[0].x = _root._xmouse;
	this.point[0].y = _root._ymouse;
	this.clear();
	this.lineStyle(0, 0, 100);
	this.moveTo(this.point[0].x, this.point[0].y);
	for (var i = 1, len = this.point.length; i<len; i++) {
		//[x1,y1] и [x2,y2] - координаты предыдущей и текущей точки соответственно
		var x1 = this.point[i-1].x, y1 = this.point[i-1].y;
		var x2 = this.point[i].x, y2 = this.point[i].y;
		// xd и yd - разница расстояний между точками
		var xd = x2-x1+this.wind;
		var yd = y2-y1+this.gravity;
		//dist - расстояние между точками
		var dist = Math.sqrt(xd*xd+yd*yd);
		//коррекция расстояния между точками до требуемого (через подобие)
		this.point[i].x = x1+(xd*this.len)/dist;
		this.point[i].y = y1+(yd*this.len)/dist;
		this.lineTo(this.point[i].x, this.point[i].y);
	}
};
//линия с 200 точками и расстоянием 5px между ними
this.line.init(200, 1);

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

Регистрация: Feb 2002
Сообщений: 358
Отправить сообщение для F_Flash с помощью ICQ
Хороший вариант решения.

Старый 25.07.2006, 18:29
tov_diatel вне форума Посмотреть профиль Отправить личное сообщение для tov_diatel Найти все сообщения от tov_diatel
  № 8  
Ответить с цитированием
tov_diatel

Регистрация: Dec 2005
Сообщений: 113
Оличный вариант!

Старый 25.07.2006, 20:46
tov_diatel вне форума Посмотреть профиль Отправить личное сообщение для tov_diatel Найти все сообщения от tov_diatel
  № 9  
Ответить с цитированием
tov_diatel

Регистрация: Dec 2005
Сообщений: 113
Все смотрел на ету веревочку и не понимал вроде все класно, но чето не хватает.Не хватает энерции. Веревка четка возвращается в исходное положения без затухающих колебаний.Но это не проблемно переделать. А так еще раз повторюсь-круто!

Старый 25.07.2006, 21:51
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 10  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Ну это уже вы сами сообразите

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

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

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


 


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


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