![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Имеется частица, к которой привязана конструкция из констрейнтов (типа гибкой цепочки), нужно привязать эту цепочку не к центру частицы, а к некой другой точке, отстоящей каким-то образом в стороне от центра. Внизу эта цепочка, извиняюсь если чо за грязный код, первый и последний констрейнт привязаны к двум шарам, которые передаются в конструктор как g1 и g2.
Ну и еще раз задача: сделать так, чтобы эти крайние констрейнты привязывались не к центру шаров, а например к краю, к какой-то другой точке в общем. Спасибо. package {
import flash.events.MouseEvent;
import org.cove.ape.*;
public class Sharf extends Group {
public var bridgeParticles:Array;
private var bridgeConns:Array;
private var downHandler:Function;
private var upHandler:Function;
public function Sharf(colB:uint, colC:uint, colD:uint, g1:Group, g2:Group,downHandlerF:Function=null,upHandlerF:Function=null) {
downHandler=downHandlerF;
upHandler=upHandlerF;
colC=colB;
var globalFriction:Number=0.5;
var bx:Number = g1.particles[0].px;
var by:Number = g1.particles[0].py;
var bsize:Number = 6;
var yslope:Number = 0;
var particleSize:Number = 1;
bridgeParticles=new Array();
bridgeConns=new Array();
var segments:Number=8;
var stifness:Number=1;
var constraintCollidable:Boolean=true;
var particle1:CircleParticle;
var particle2:CircleParticle;
for(var i:Number=0;i<segments;i++)
{
bridgeParticles[i] = new CircleParticle(bx,by,particleSize);
bridgeParticles[i].setStyle(1, 0xFF0000, 1, colB);
bridgeParticles[i].friction=globalFriction;
bridgeParticles[i].mass=0.1;
bridgeParticles[i].sprite.buttonMode=true;
bx += bsize;
by += yslope;
bridgeParticles[i].sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
addParticle(bridgeParticles[i]);
if(i==0)
{
particle1=g1.particles[0];
particle2=bridgeParticles[i];
}else{
particle1=bridgeParticles[i-1]
particle2=bridgeParticles[i];
}
bridgeConns[i] = new SpringConstraint(particle1, particle2,
stifness, constraintCollidable, particleSize*2, 1,true);
bridgeConns[i].setStyle(1, colC, 0, colB);
SpringConstraint(bridgeConns[i]).fixedEndLimit=1;
addConstraint(bridgeConns[i]);
bridgeConns[i].sprite.buttonMode=true;
bridgeConns[i].sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
}
bridgeConns[segments] = new SpringConstraint(bridgeParticles[segments-1], g2.particles[0],
stifness, constraintCollidable, particleSize*2, 1,true);
bridgeConns[segments].setStyle(1, colC, 0, colB);
addConstraint(bridgeConns[segments]);
bridgeConns[segments].sprite.buttonMode=true;
bridgeConns[segments].sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
var bridgeConn:SpringConstraint = new SpringConstraint(g1.particles[0], g2.particles[0],
0.005, false, 1, 1,true);
bridgeConn.setStyle(1, 0xFFFF00, 0, 0xFF0000);
//addConstraint(bridgeConn);
}
public function startListeners():void
{
for each (var part:CircleParticle in bridgeParticles)
{
part.sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
};
for each (var constr:SpringConstraint in bridgeConns)
{
constr.sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
};
}
public function stopListeners():void
{
for each (var part:CircleParticle in bridgeParticles)
{
part.sprite.removeEventListener(MouseEvent.MOUSE_DOWN,downHandler);
};
for each (var constr:SpringConstraint in bridgeConns)
{
constr.sprite.removeEventListener(MouseEvent.MOUSE_DOWN,downHandler);
};
}
}
}
|
|
|||||
|
Я решил залезть в исходники и сдвинуть круг от центра, теперь правда круги друг с другом не всегда сталкиваются:
/*
Copyright (c) 2006, 2007 Alec Cove
Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be included in all copies
or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
TODO:
- getProjection() needs review for any possibility of precomputing
*/
package org.cove.ape {
/**
* A circle shaped particle.
*/
public class CircleParticle2 extends AbstractParticle {
private var _radius:Number;
/**
* @param x The initial x position of this particle.
* @param y The initial y position of this particle.
* @param radius The radius of this particle.
* @param fixed Determines if the particle is fixed or not. Fixed particles
* are not affected by forces or collisions and are good to use as surfaces.
* Non-fixed particles move freely in response to collision and forces.
* @param mass The mass of the particle.
* @param elasticity The elasticity of the particle. Higher values mean more elasticity or 'bounciness'.
* @param friction The surface friction of the particle.
*/
var offsetDirection:Number=1;
public function CircleParticle2 (
dir:Number,
x:Number,
y:Number,
radius:Number,
fixed:Boolean = false,
mass:Number = 1,
elasticity:Number = 0.3,
friction:Number = 0) {
offsetDirection=dir;
super(x, y, fixed, mass, elasticity, friction);
_radius = radius;
}
/**
* The radius of the particle.
*/
public function get radius():Number {
return _radius;
}
/**
* @private
*/
public function set radius(r:Number):void {
_radius = r;
}
/**
* Sets up the visual representation of this CircleParticle. This method is called
* automatically when an instance of this CircleParticle's parent Group is added to
* the APEngine, when this CircleParticle's Composite is added to a Group, or the
* CircleParticle is added to a Composite or Group.
*/
public override function init():void {
cleanup();
if (displayObject != null) {
initDisplay();
} else {
sprite.graphics.clear();
sprite.graphics.lineStyle(lineThickness, lineColor, lineAlpha);
sprite.graphics.beginFill(fillColor, fillAlpha);
sprite.graphics.drawCircle(radius*offsetDirection, 0, radius);
sprite.graphics.endFill();
}
paint();
}
/**
* The default painting method for this particle. This method is called automatically
* by the <code>APEngine.paint()</code> method. If you want to define your own custom painting
* method, then create a subclass of this class and override <code>paint()</code>.
*/
public override function paint():void {
sprite.x = curr.x;
sprite.y = curr.y;
}
/**
* @private
*/
public function getProjection(axis:Vector):Interval {
var c:Number = samp.dot(axis);
var cos:Number=axis.x/Math.sqrt(Math.pow(axis.x,2)+Math.pow(axis.y,2));
interval.min = c - _radius+offsetDirection*20*cos;
interval.max = c + _radius+offsetDirection*20*cos;
return interval;
}
/**
* @private
*/
internal function getIntervalX():Interval {
interval.min = samp.x - _radius+_radius*offsetDirection;
interval.max = samp.x + _radius+_radius*offsetDirection;
return interval;
}
/**
* @private
*/
internal function getIntervalY():Interval {
interval.min = samp.y - _radius;
interval.max = samp.y + _radius;
return interval;
}
}
}
|
|
|||||
|
Лучше не стоит править внутренности методов движка, назначение которых не понятно - иначе все посыпется)
Если нужно прицепить цепочку не к центру объекта, сделайте последний составным (из частиц и связей) с партиклом в том месте, куда надо прицепить цепочку. |
|
|||||
|
Ну назначение их, в общем понятны:
getProjection - Проекция на некую ось getIntervalX, getIntervalX - проекции на вертикальные оси, надо полагать отвечают за столкновения, в моем случае есть 2 шара, к одному нужно привязать цепочку справа, к другому - слева, вот и подписал offsetDirection*20*cos, где cos - угол наклона этой оси к горизонту, а offsetDirection - передаваемый параметр в конструктор, либо +1, либо -1, в зависимости от того, справа, или слева должна быть точка, кстати ситуация как раз такая, что эта точка не тудет центром тяжести и круг относительно нее вращаться не будет. Интересный момент в том, что с другими частицами CircleParticle2 сталкивается нормально, а вот друг с другом - почему-то через раз. |
|
|||||
|
Это хак. Может быть он локально и решит какую-то задачу, но глобально начнут появляться неприятные сюрпризы. APE построен на алгоритме разделяющих осей и методы getProjection, getIntervalX, getIntervalY выдают проекции частицы на произвольную, горизонтальную и вертикальную оси соответственно. Если вы залезете внутрь и начнете выдавать то, что вам хочется, вместо того, что есть на самом деле - ждите беды =)
Ну это все имхо. Задайте этот вопрос в гугл-группе, может там дадут более компетентный ответ. |
|
|||||
|
[+4 05.12.07]
[+1 11.01.08] Регистрация: Nov 2007
Сообщений: 51
|
Подскажите где взять туториалы по APE?
Cамому ничего не получается .или по другим физ. движкам. Последний раз редактировалось etc; 08.12.2007 в 00:40. |
|
|||||
|
island, глобально релиз в пятницу =)), ждать когда авторы сподобятся сами это сделать не могу - значит будет хак
Freeeeeeeman, туториалы в разработке, учи по исходникам демки |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:38. |
|
|
« Предыдущая тема | Следующая тема » |
|
|