Pergunta

Eu gostaria de desviar uma bola em um ângulo dependendo de onde ela atinge uma pá. Agora, eu só estou mudando a coordenada y, o que resulta em uma deflexão desinteressante. Será ângulo, mas independente no local impacto contra o remo. Eu gostaria de algo mais divertido. Velocidade, força, massa e outros fatores não precisa ser levado em consideração. ângulo de apenas dependendo da localização impacto da pá. Eu li este um número erro (NAN) fazendo detecção de colisão em uma iphone app mas parece muito complicado para o que eu estou procurando. Existe uma maneira mais simples para calcular a deflexão?

Os objetos são dois UIImageViews.

Foi útil?

Solução

Bem, nada realista, mas você poderia fazer algo para que o ângulo de saída é de apenas dependente de onde no remo bate.

Eu nunca fiz qualquer iPhone ou objetivo de codificação, então eu vou escrever algo em pseudo código / C C.

Primeiro eu calcular a velocidade, que é o comprimento do vetor velocidade, ou:

double speed = sqrt(velX * velX + velY * velY); // trigonometry, a^2 + o^2 = h^2

Em seguida, queremos calcular o novo ângulo com base em onde nós batemos o remo. Eu estou indo supor que você armazenar a colisão X em impactX e o comprimento da pá em paddleLength. Dessa forma, podemos calcular um ângulo de saída. figura Primeiro vamos descobrir como calcular o intervalo para que obter um valor entre -1 e 1.

double proportionOfPaddle = impactX / (double) paddleLength; // between 0 and 1
double impactRange = proportionOfPaddle * 2 - 1; // adjust to -1 and 1

Vamos supor que nós não queremos desviar a bola completamente para o lado, ou 90 graus, uma vez que seria muito difícil de recuperar. Desde que eu vou usar o impactRange como o novo Vely, eu vou escalá-lo para baixo para dizer -0,9 para 0,9.

impactRange = impactRange * 0.9;

Agora precisamos calcular o velX modo que a velocidade é constante.

double newVelX = impactRange;
double newVelY = sqrt(speed * speed - newVelX * newVelX); // trigonometry again

Agora você devolver o newVelX e newVelY e você tem um impacto e velocidade de salto dependente.

Boa sorte!

(poderia muito bem ser bugs no aqui, e eu poderia ter invertido o X ou Y, mas espero que você começa a idéia geral).

Editar :. Adicionando alguns pensamentos sobre como obter o impactX

Vamos supor que você tem a ball.center.x eo paddle.center.x (não sei o que você chamá-lo, mas vamos supor que paddle.center.x nos dará o centro da pá) deveríamos ser capaz de calcular o impactRange a partir daí.

Precisamos também o raio da esfera (eu vou assumir ball.width como o diâmetro) e o tamanho da pá (paddle.width?).

int ballPaddleDiff = paddle.center.x - ball.center.x;
int totalRange = paddle.width + ball.width;

O menor valor para ballPaddleDiff seria quando a bola é simplesmente tocar no lado da raquete. Isso ballPaddleDiff seria então paddle.width / 2 + ball.width / 2. Assim, o novo impactRange seria, portanto,

double impactRange = ballPaddleDiff / (double) totalRange / 2;

Você provavelmente deve verificar o impactRange para que ele realmente é entre -1 e 1 para que a bola não disparar para as estrelas ou algo assim.

Outras dicas

Você não necessariamente quer realista, você quer diversão. Aqueles nem sempre são uma ea mesma coisa. Se você queria realista, você não pode jogar fora de velocidade, força, massa, etc. Em um jogo normal do pingue-pongue, o ponto onde ela atinge o remo realmente não importa, há não um ponto doce como em uma raquete de tênis .

Desenvolver uma função matemática que irá retornar um vector de saída, ou uma velocidade e um vector de unidade, o que representa o ângulo de saída e a velocidade da bola, dando um ângulo de entrada, a velocidade, o ponto de impacto na pá, e a velocidade da pá .

Já esperar que o ângulo de saída = -1 * ângulo de entrada. velocidade de saída, também seria de esperar que seja -1 * a velocidade de entrada. Então, se você quer misturar-se, ajustar os. Você poderia aumentar o ângulo de saída proporcional à distância do centro da raquete. Você também pode aumentar o ângulo ou a proporcional velocidade para a velocidade da raquete quando seu hit.

Há uma série de maneiras que você poderia fazer isso, então eu realmente não posso dizer exatamente o que funcionar você usaria, você vai ter que descobrir isso com testes e jogar. Se você ainda precisar de mais informações adicionar mais detalhes à sua pergunta.

O código a seguir (C ++, mas fácil o suficiente para converter a ObjC), leva um vector 2D entrada e reflete-lo com base em uma superfície normal (o rosto de seu bastão pong).

Você pode adicionar algum aleatório 'fator divertido', randomizando um deslocamento que você quer aplicar a 'escalar' -. A velocidade de mudança, ou para a superfície normal, para alterar o ângulo de reflexão

Eu estou usando isso no meu projeto de iPhone, e ele funciona muito bem:)

void vec2ReflectScalar(vec2& vResult, const vec2& v1, const vec2& normal, float scalar)
{
    vec2  _2ndotvn;
    float dotVal = vec2DotProduct(v1, normal); 

    vec2Scale(_2ndotvn, normal, scalar * 2.f * dotVal);
    vec2Subtract(vResult, v1, _2ndotvn); 
}

void vec2Reflect(vec2& vResult, const vec2& v1, const vec2& normal)
{
    vec2ReflectScalar(vResult, v1, normal, 1.f);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top