камеры?
Взять вектор направления камеры, умножить его на длину вектора велосити, теперь это новая велосити.
target_velocity *= $SpringArm3D.rotation типа такого?
типа velocity = velocity.length() * camera.direction - только я не в курсе, как именно там в тридэ для этого называются функции, тем более в четвёрке.
В смысле повернуть объект в сторону точки, используя torque_force? Напомни через пару часов, как к компу подойду - скину код.
func move_distance(V0 : float, Vmax : float, A : float, S : float, dt : float): if absf(V0) > Vmax: return signf(V0) * maxf(Vmax, absf(V0) - A * dt) var s_a = (3 * Vmax - V0) * Vmax / A if S < s_a: var v1 = (V0 - sqrt(V0**2 + 12*S*A)) / (2*A) var vt = minf(absf(v1), Vmax) var v = V0 if !is_equal_approx(v, vt): return minf(vt, v + A * dt) if !is_zero_approx(v): return maxf(v - A * dt, 0) else: var v = V0 var s_a_stop = 2 * Vmax * Vmax / A if S > s_a_stop: if !is_equal_approx(v, Vmax): return minf(Vmax, v + A * dt) return Vmax if !is_zero_approx(v): return maxf(v - A * dt, 0) return 0 # дёргать вот так var angle_diff = wrapf(global_position.angle_to_point(get_global_mouse_position()) - rotation, -PI, PI) var _angular_velocity = sign(angle_diff) * move_distance(sign(angle_diff) * angular_velocity, angular_speed_max, angular_acceleration, absf(angle_diff), delta) apply_impulse(_angular_velocity * mass)
Спасибо большое. А чего так сложно?
Лёва (0) повысил карму Александр (8)
Коротко? Потому что физика.
Длинно? Чтобы не переопределять скорость и реалистично улететь от пощёчины. И чтобы наиболее быстро попасть в конечную точку, не осциллируя (болтаясь) вокруг конечной точки.
В 3D для CharacterBody достаточно задавать вектор с помощью базиса, и игрок будет ходить в сторону направления взгляда. var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
А инерцию легко симулировать с помощью постоянного сбавления скорости до нуля с определенной скоростью
Ага, вот только на последнем этапе if absf(distance < max_velocity * delta) : velocity = 0 при вращении за курсором получается баг, когда объект крутится куда быстрее max_velocity И этот баг не лечится нормально, только окостыливается. Лучшее решение без ускорений - lerp_angle
А откуда transform берётся?
Из Node3D и ее наследников
func _physics_process(delta): var direction = (Vector3( Input.get_action_strength("move_right") - Input.get_action_strength("move_left"), 0, Input.get_action_strength("move_back") - Input.get_action_strength("move_forward") ) * $SpringArm3D.transform.basis).normalized() Пока пытаюсь сделать так, но это не работает
Обсуждают сегодня