속도가 증가함에 따라 물체의 속도가 줄어드는 방법


11

Flash에서 게임을 개발 중이며 약간의 도움이 필요합니다. 수학 문제로 간주 될 수 있습니다.

물체가 빠른 속도로 날고 있으며 물체가 X돌과 충돌 할 수 있습니다. 돌과 충돌 할 때 돌을 부수고 계속하기 위해 물체가 필요하지만 속도는 느립니다. 하드 코딩하고 다음과 같은 것을 작성하는 것은 쉽습니다. myVelocity -= 10;하지만 내 주요 문제는 초기 속도가 높을수록 속도가 줄어드는 것을 원한다는 것 입니다.

예를 들어 속도가 300이면 10을 잃고 싶고 200이면 20을 잃고 싶습니다.

어떤 종류의 공식으로 이것을 할 수 있습니까?


1
어떻 log(myVelocity + 1) * N습니까?
Jonathan Connell

답변:


6

나는 속도를 반전시키고 당신이 좋아하는 것을 곱할 것입니다 :

float velocity = 300.0f;
float collisionEffect = 3000.0f / velocity;
if (collisionEffect > velocity)
{
    // Choose which one you like: with or without restitution

    // No restitution
    collisionEffect = velocity;

    // Restitution
    collisionEffect = velocity + (collisionEffect - velocity) * 0.3f;
}
velocity -= collisionEffect;

이 예제는 다음과 같은 효과를 제공합니다.

400 loses 7.5
300 loses 10
200 loses 15
100 loses 30
 50 loses 50  // Using no restitution
 50 loses 53  // Using restitution
 20 loses 20  // Using no restitution
 20 loses 59  // Using restitution

"배상"이란 무엇입니까?
jprete

배상이 튀는 중입니다. 어느 것이 현실적입니다.
Martijn Courteaux

30

당신과 다른 사람들이 묘사하는 시스템은 실제적으로 보이는 물리를 생성하지 않을 것입니다. 주요 공식은 물체가 어딘가에 닿을 때마다 0.5 * m * v ^ 2 (운동 에너지)를 일정한 값 으로 줄이는 것 입니다.

무게가 2Kg 인 물체가 블록에 부딪히면 16j의 에너지가 필요합니다.

4  m/s -> the block will not break
5  m/s -> 3   m/s
6  m/s -> 4.4 m/s
7  m/s -> 5.7 m/s
8  m/s -> 6.9 m/s
9  m/s -> 8   m/s
10 m/s -> 9.1 m/s

7
이것은 정확하고 현실적이며 구현하기 쉬우 며 모든 물체 및 블록 질량 및 속도를 처리합니다.
Tesserex

3
달성 하려는 특정 '만화 물리학'효과가 없다면보다 현실적인 시스템을 사용하는 것은 거의 항상 좋은 생각입니다. 잠재적으로 엔진을 능가하는 최첨단 사례를 얻지 못하게하는 더 좋은 방법은 거의 없습니다.
Steven Stadnicki

1
이 대답은 좋았습니다. 그러나 내 게임은 만화 세계에 설정되어 있으며 현실적이 될 필요가 없습니다. 질문 할 때 좀 더 구체적으로 말해야합니다.
Afra

1
이것은 커뮤니티 프로젝트이며, 사람들은 여기에 질문에 대한 답변을했으며 여기에 가장 적합한 답변이 있습니다. 특정 사례에 해키 솔루션을 선호한다고해서이 답변이 최선의 답변이 아님을 의미하지는 않습니다. 해키 답변을 솔루션으로 선택하면 다른 사람이 사이트에서 이런 종류의 질문에 대한 답변을 검색 할 때 비현실적인 답변이 더 나은 것으로 가정합니다.
Richard Fabian

1
@Richard 다른 솔루션은 단순히 현실적인 물리학을 사용하지 않기 때문에 해킹되지 않습니다. 테트리스는 블록이 부드럽게 떨어지지 않기 때문에 해킹입니까? 사람들이 대답을 만족시키는 답이라고 가정하는 대신 받아 들여진 대답이 '더 나은'답이라고 가정한다면 그것은 그들의 잘못입니다. 모든 답변과 투표는 여전히 분명합니다.
CiscoIPPhone

2

원하는 범위, 즉 제한이 있는지, 기하학적 진행이 필요한지 등을 알려주는 정보가 충분하지 않습니다.

가장 먼저하고 싶은 것은 잃고 자하는 속도에 비례하는 숫자를 얻는 것입니다 (동일 필요는 없지만 속도가 증가함에 따라 감소하면 손실에 비례합니다). 이를 수행하는 표준 방법은 역수 를 취하는 것입니다 .

temp = 1 / currentVelocity;

이제 100의 경우 0.01, 200의 경우 0.005, 300의 경우 0.0033 등이됩니다.

이제 숫자를 곱하여 원하는 숫자로 조정하면됩니다. 그래서

k = 3000;
newVelocity = temp * k;

20을 300으로 줄 것이지만 10이 아니라 200을 15로 줄 것입니다.이 경우 더 이상 읽을 필요가 없습니다. k를 원하는대로 조정할 수 있지만 기하 진행을 구현하거나 증가를 위해 기저를 변경하는 등 조금 더하지 않으면 원하는 방식으로 숫자를 얻지 못할 수 있습니다. 여기서는 기하학적 진행 과정을 진행하지 않겠지 만베이스를 변경하려면 다음과 같이하십시오.

base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!

k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
    velocityLoss = currentVelocity; //(2)

이것은 당신이 당신의 질문에서 원래 요구했던 범위, 300-> 10의 손실, 200-> 20의 손실을 제공 할 것입니다. FYI 100-> 40의 손실, 50-> 80의 손실 (!) 뺄셈을 제한해야합니다. 이것은 내가 줄 (1)과 (2)에서 한 것입니다.

물론이 모든 문제에 접근하는 다른 방법이 있습니다. 물론 나보다 수학적으로 능숙한 사람들이 여기에 게시 할 것이라고 확신합니다.


0

속도로 간단한 나눗셈을 사용할 수 있다고 생각합니다. 예를 들어 : lost = 3 000 / myVelocity. 속도가 300이면 10을 잃고 200이면 15를 잃습니다. 올바른 상수를 선택하는 것은 당신에게 달려 있습니다.

원하는 경우 constant / (constant2 * velocity ^ 2 + constant3 * velocity)와 같이 더 복잡한 수식을 사용할 수 있습니다. 다시 한번-상수를 선택하십시오.


그가 요구 한 것과 실제 물리학에서 일어나는 일과는 완전히 반대입니다.
Ali1S232

이해가 안 돼요 반대 란 무엇입니까?
zacharmarz

나는 당신이 대답하지 오해, 내 나쁜 것 같아요.
Ali1S232
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.