Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Точный расчет колизии


Автор: Graf_h 5.11.2008, 10:57
Привет! как можно точно расчитать колизии! Припустим есть обект, сфера для росчета колизии радиусом примерно 25 пикселей. обьект движется со скоростью 30 пикселей в тик.Дальше, припустим обекты находятся на расстояниее 10 пикселей, а двигаются - 30 пикселей, в итоге они пересекутся, но не должны:(

Автор: Rickert 5.11.2008, 11:14
Graf_h
0) Лучше сравнивать не пиксели, а радиусы.
1) Узнали что объекты пересекаются - отводим один из объектов назад.

Автор: Graf_h 5.11.2008, 11:43
Спасибо Rickert, я так и думал! но когда движение по сплайну:

Код

public function calculateSpline(t:Number):V_Point{
            var new_point:V_Point = new V_Point(0,0)
            new_point.x =(1-t)*(1-t)*(1-t)*first_point.x + 3*t*(1-t)*(1-t)*anchor1.x+3*t*t*(1-t)*anchor2.x+t*t*t*last_point.x
            new_point.y =(1-t)*(1-t)*(1-t)*first_point.y + 3*t*(1-t)*(1-t)*anchor1.y+3*t*t*(1-t)*anchor2.y+t*t*t*last_point.y
            return new_point
        }


как в этом случае! я при пересечении ставил цикл while и отодвигал на один шаг назад! Но думаю можно както компакнее сделать smile 

Автор: Rickert 5.11.2008, 11:52
Graf_h, какая разница какой длинны получается код? Главное быстродействие. У тебя куча констант, которые не меняются - выноси их в переменные. Ктсати, тут же и компактность добавится.

Автор: Graf_h 5.11.2008, 12:04
Цитата(Rickert @  5.11.2008,  11:52 Найти цитируемый пост)
 Главное быстродействие. 

как можно без цыклов обойтись?Вот что  у меня получается:
Фрагмент кода:

Код

public function Move():void{
          for (var i:uint=0;i<this.mas_objects.length;i++){
                   this_f = mas_objects[i]

                   if (this_f.moveflag){
                   if (this_f.speed<0){this_f.orient=1}
                   this_f.speed+=this_f.speed_step*this_f.orient
                   if (this_f.speed>=this_f.max_speed){this_f.speed=this_f.max_speed}
                   this_f.pos+=this_f.speed*this.this_spline.spline_step*this_f.orient    
                   n_point = this.this_spline.calculateSpline(this_f.pos)
                   this_f.x=n_point.x;this_f.y=n_point.y
                   n_point = this.this_spline.calculateSpline(this_f.pos+this.this_spline.spline_step*this_f.orient)
                    this_f.rot(n_point.x,n_point.y)

            


                       if (i==0){
                              //Это пропускаем, здесь без проблем
                       } else{
                               prew_f= mas_objects[i-1]
                               var c1:Number=(this_f.x*this_f.forward_vector.x)-(prew_f.x*prew_f.forward_vector.x)
                               var c2:Number=(this_f.y*this_f.forward_vector.y)-(prew_f.y*prew_f.forward_vector.y)
                               var z:Number=Math.sqrt(c1*c1 + c2*c2)
                               if (z<V_Utility.FISHKA_SIZE){
                                               this_f.moveflag=false
                                               //меня вот этот цыкл смущает :(
                                               while (z<V_Utility.FISHKA_SIZE){
                                                           this_f.pos-=this.this_spline.spline_step    
                                                           n_point = this.this_spline.calculateSpline(this_f.pos)
                                                           this_f.x=n_point.x;this_f.y=n_point.y
                                                           n_point = this.this_spline.calculateSpline(this_f.pos+this.this_spline.spline_step)
                                                           this_f.rot(n_point.x,n_point.y)

                                                           c1=(this_f.x*this_f.forward_vector.x)-(prew_f.x*prew_f.forward_vector.x)
                                                           c2=(this_f.y*this_f.forward_vector.y)-(prew_f.y*prew_f.forward_vector.y)
                                                           z=Math.sqrt(c1*c1 + c2*c2)

                                               }

                               }

                       }

               }

         }

}



Автор: Rickert 5.11.2008, 12:13
Омайн год smile  "this." ? O_O
Сказать честно: откуда растут рога у всего это невозможно. Пожалей smile что это вообще там происходит? Сдвигаешь позицию, пересчитываешь положение сплайна, опять сдивгаешь позицию, опять пересчитываешь и ещё вроде вращаешь. Там по идее должны быть что-нить типа расчитать положение на момент t вроде.

Автор: Graf_h 5.11.2008, 12:23
Цитата(Rickert @  5.11.2008,  12:13 Найти цитируемый пост)
двигаешь позицию, пересчитываешь положение сплайна, опять сдивгаешь позицию, опять пересчитываешь и ещё вроде вращаешь

А как по другому?pos это как раз и есть t (0..1)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)