Просмотр полной версии : Движение тени
_pkiller_
13.02.2006, 05:52
есть сцена - вокруг большого шара двигается другой поменьше и отбрасывает тень. предполагается наличие более чем одного маленького шара, пытаюсь делать прототип, а потом множить его и поворачивать. Все движения задаются программно. Вращение сделано, но при повороте тень никак не хочет правильным образом проецироваца на плоскость. Перепробованы все формулы из школьного курса преобразования координат при повороте, но ни одна из них не дает правильного результата. Вот код движения тени с вариантами.
onEnterFrame = function () {
shadow._rotation = -_parent._rotation;
// shadow._x = _parent.ball._x;
// shadow._y = _parent.ball._y;
// shadow._x = _parent.ball._x*Math.cos(this._rotation)-_parent.ball._y*Math.sin(this._rotation);
// shadow._y = _parent.ball._y*Math.cos(this._rotation)+_parent.ball._x*Math.sin(this._rotation);
// shadow._x = _parent.shadow2._x+(_parent.ball._x-_parent.shadow2._x)*Math.cos(this._rotation)+(_parent.shadow2._y-_parent.ball._x)*Math.sin(this._rotation);
// shadow._y = _parent.shadow2._y+(_parent.ball._x-_parent.shadow2._x)*Math.sin(this._rotation)+(_parent.ball._y-_parent.shadow2._y)*Math.cos(this._rotation);
shadow._x = shadow._x+(_parent.ball._x-shadow._x)*Math.cos(this._rotation)+(shadow._y-_parent.ball._x)*Math.sin(this._rotation);
shadow._y = shadow._y+(_parent.ball._x-shadow._x)*Math.sin(this._rotation)+(_parent.ball._y-shadow._y)*Math.cos(this._rotation);
shadow._alpha = 60+_parent.ball._y;
shadow._yscale = shadow._xscale=50+_parent.ball._y;
};
Укажите на неточность, а то скоро совсем голова сломается.
_pkiller_
14.02.2006, 04:17
РАзве нет знающих людей?
А я так надеялся.
_pkiller_
16.02.2006, 06:14
Ладно давайте попробуем с другой стороны.
С помощью какого алгоритма можно задать движение тени для объектов, созданных путем поворота на угол одно и того же прототипа. Прототип двигает по эллипсоидной окружности. Тени от всех объектов естессно должны лежать в одной плоскости.
для меня самого физика довольно проблемный предмет, мне не до конца понятна организации сцены у тебя, но из того, что я понял я бы избрал другой подход - намного проще. (если это просто эффект, а не основа какого-нибудь движка) Попробуй по аналогии со следующей ситуацией. _rotation очень удбно привязывать к пройденному пути. например, катится мяч и требуется естественно вращать его поверхность, чтоб создать иллюзию вращения. Оказалось все невероятно просто (я сам не ожидал) - просто делал surface._rotation = mc._x (просто движение было только по х, поэтому он и был единственной точкой привязки. При движении по окружности надо будет просто вычислять пройденный путь). Т.е. нарисовав один раз проекцию тени и поместив точку ее регистрации в точку регистрации самого тела, вращать ее. Вращение же по элипсу можно вообще эмулировать - нарисовал невидимый круг воруг тела, крутанул по вышеописанному принципу, сплющил, прицепил к конторльной точке спроецированную тень. А может тень у тебя вообще не меняет форму? - тогда еще проще получается.
все несколько туманно, но может натолкнет на что полезное
_pkiller_
17.02.2006, 11:57
сенкс, обмозгую вариант)
_pkiller_
01.03.2006, 05:02
попробывал, получается не очень. По условиям задачи объект движется сначал по прямой, а уже потом по эллипсу. Все написано кодом. Было бы неплохо написать код для тени, чтоб она отслеживала движение объекта и св соответствии с ним изменялась. Но вот программно что-то не очень получается. Неужели нет у нас знающих людей.
источник света далеко от объекта? подвижен ли? Если вариант типа земля-солнце, то можно все сделать с помощью единожды прорисованной тени, просто программно менять ее размеры по горизонтали и вертикали. Немного только повозиться с подбором коэффициентов уравнений, для естесственности. Если что-то вроде проблемы с фонарем, тогда сложнее - без школьной физики не обойтись. Ну это должен быть, вероятно, супер-клип ради которого стоит так выкладываться (без знаний физики).
_pkiller_
02.03.2006, 02:42
сцена аналог солнечной системы (для ясности), только мелкие объекты движутся в разных плоскостях, аля электроны протоны вокруг атома. Как сделать я понимаю, но тень неправильная получается. В верхнем топе есть уравнения, которые я пытался привязать к тени.
_pkiller_
03.03.2006, 03:03
На картинке показано, чего я хочу добиться, так же прилоэен исходник с моими попытками. До сих пор ничего не получается. Где же все наши знатоки и профи??
Смотри, источник света в твоей модели бесконечно удален поэтому, вращение тени происходит по элипсу. Если ты посмотришь на картинку внимательно, то заметишь, что главная ось элипса тени равна главной оси движения объекта умноженной на косинус угла между плоскостью движения и плоскостью проекции тени. Далее, возникает вопрос о второй оси элипса. каков его размер? Здесь нужно понять, что этот размер зависит от угла под которым наблюдатель смотрит на сцену, поэтому вторую ось нужно просто подобрать так чтобы она лучше смотрелась =) Здесь всё субъективно =)
Вопрос, а для чего Вы делаете эту задачу?
_pkiller_
03.03.2006, 06:34
Наблюдатель смотрит на сцену всегда под одним углом. При повороте, больший радийс элипса движения тени должен уменьшаться, по идее должна помочь формула
x' = cosine(a)*x - sine(a)*y
y' = sine(a)*x + cosine(a)*y
где а - угол поворота.
Но не помогает, почему не знаю. Тень не хочет двигаться по правильное траектории.
решение в схематическом виде. Может поможет
забыл сказать. Размер тени менять - уже не проблема, в зависимости от "у"
_pkiller_
06.03.2006, 02:55
спасибо за подсказку, с размером не проблема. Но даже в твоем примере координата _х тени не всегда совпадает с координатой _х объекта. Я нашел почему у меня не работала формула, просто надо было перевести радианы в градусы)) Но и в этом случае получается картина, как у тебя. В крайних точках координаты совпадают, а мужду нет, даже на глаз видна разница.
если не совпадает _х, тогда можно просто сделать shadow._x = body._x
Главное, что _у совпадают.
_pkiller_
07.03.2006, 09:46
если не совпадает _х, тогда можно просто сделать shadow._x = body._x
Главное, что _у совпадают.
Попробывал, получилось, теперь координаты _х совпадают, выглядит неплохо. Еще раз всем сенкс большой. Хоть и не так как я хотел, но всеже. Но гложет меня идея сделать все программно)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.