[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Godot Engine » FAQ (Частые Вопросы) » Как преобразовать локальные координаты в глобальные (сабж)
Как преобразовать локальные координаты в глобальные
yraДата: Пт, 04.05.2018, 23:59 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 29
Награды: 0
Репутация: 15
Статус: Оффлайн
Делаю систему управления игрой (3д от первого лица). Получаю вектор на который нужно перенести объект в локальных координатах. Как преобразовать его в глобальные координаты , т.к. метод которому его нужно передать воспринимает именно глобальные координаты.  wacko
 
skanersoftДата: Сб, 05.05.2018, 16:59 | Сообщение # 2
Админ
Группа: Администраторы
Сообщений: 30
Награды: 0
Репутация: 501
Статус: Оффлайн
А разве global_position объекта не содержит его глобальные координаты?

Главный Админ Godot Engine Russia
 
yraДата: Сб, 05.05.2018, 22:32 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 29
Награды: 0
Репутация: 15
Статус: Оффлайн
Спасибо, сейчас попробую объяснить в чем дело.  Сейчас код такой (я убрал лишнее, чтобы облегчить понимание) . Этот код я скачал в магазине ассетов в годо. Проблема в том, что при такой реализации главный герой проходит сквозь контуры столкновений (что не удивительно, ведь мы просто перемещаем объект) . 
Код
const VECTOR0=  Vector3(0,0,0)
var vel = Vector3()

func _process(delta):
var is_on_ground = playerfeet.is_colliding()
var on_top = playerfeet.get_collider()
   #Section for jumping
   if is_on_ground:
jumping = false
   if Input.is_key_pressed(KEY_SPACE) and not jumping:
      var velocity = get_linear_velocity()
      velocity.y = JUMP_VEL
      set_axis_velocity(velocity)
      jumping = true
   #Section for basic movement.
   if Input.is_key_pressed(KEY_W):
      #translate(Vector3(0, 0, speed*delta))
      #set_axis_velocity(Vector3(0,0,speed)+rotation)
      #apply_impulse(rotation, Vector3(0,0,speed))
      vel.z=speed*delta
   if Input.is_key_pressed(KEY_S):
      #translate(Vector3(0, 0, -speed*delta))
      #apply_impulse(VECTOR0, Vector3(0,0,-speed))
      vel.z=-speed*delta
   if Input.is_key_pressed(KEY_A):
      #translate(Vector3(speed*delta, 0, 0))
      #apply_impulse(VECTOR0,Vector3(speed,0,0))
      vel.x=speed*delta
   if Input.is_key_pressed(KEY_D):
      #translate(Vector3(-speed*delta, 0, 0))
      #apply_impulse(VECTOR0,Vector3(-speed,0,0))
      vel.x=-speed*delta
   #set_axis_velocity(vel)
   translate(vel)
   vel=VECTOR0

Я попробовал заменить функцию translate, на set_axis_velocity, но она работает с глобальными координатами и получается полная ерунда (объект просто двигается по осям не зависимо от поворота), зато он не проходит сквозь staticbody )) Вот сижу думаю как решить эту проблему.

Добавлено (05.05.2018, 22:32)
---------------------------------------------
Я понял в чем проблема - translate не учитывает столкновения. Есть ли какая нибудь функция, которая их учитывает?

 
skanersoftДата: Сб, 05.05.2018, 23:05 | Сообщение # 4
Админ
Группа: Администраторы
Сообщений: 30
Награды: 0
Репутация: 501
Статус: Оффлайн
В 3D не работал еще, но думаю, что должен быть аналог двадэшных move_and...(slide/collide)

Главный Админ Godot Engine Russia
 
yraДата: Вс, 06.05.2018, 00:22 | Сообщение # 5
Сержант
Группа: Пользователи
Сообщений: 29
Награды: 0
Репутация: 15
Статус: Оффлайн
В том то и дело, что не могу найти их аналог (персонаж-Ridgetbody) . Нашел такой урок на сайте годо http://docs.godotengine.org/en/latest/tutorials/3d/fps_tutorial/part_one.html он на английском, читаю с яндекс переводчиком - все-равно не очень понятно.

Добавлено (06.05.2018, 00:01)
---------------------------------------------
Обнаружил, что у KinematicBody есть методы move_and... (slide/collaide) , а у RigidBody нет. Вот думаю, что делать - может просто поменять Rigid на KinematicBody? Но все-таки хотелось бы разобраться с RigidBody.

Добавлено (06.05.2018, 00:22)
---------------------------------------------
С KinematicBody ничего не получилось - не работает гравитация. Посмотрел документацию на RigidBody - у него есть два нужных нам метода: apply_impulse и set_axis_velocity, но оба они работают с глобальными координатами, а у нас есть локальные. Кстати move_and_collaide в KinematicBody тоже работает с глобальными координатами. Так что надо искать способ преобразовать локальные координаты в глобальные. На всякий случай выложу скрипт целиком.

Код
extends RigidBody
#Variables
var global = "root/global"

var X = 0.00
var Y = 0.00

var speed = 5
var moving = true
var MOUSESPEED = 0.005
var JUMP_VEL = 4
var jumping = false

const VECTOR0=Vector3(0,0,0)
var vel = Vector3()

onready var playerfeet = get_node("playerfeet")
onready var camera = get_node("Camera")

func _ready():
   Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
   Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
   set_physics_process(true)
   set_process_input(true)

func _input(event):
   # For Mouse Look. The Camera node has a script for the X rotation.
   if event is InputEventMouseMotion:
      rotation.y -= event.relative.x*MOUSESPEED
   # Function to close game.
   if Input.is_key_pressed(KEY_ESCAPE) or Input.is_key_pressed(KEY_Q):
      get_tree().quit()

func _process(delta):
   var is_on_ground = playerfeet.is_colliding()
   var on_top = playerfeet.get_collider()
   #Section for jumping
   if is_on_ground:
      jumping = false
   if Input.is_key_pressed(KEY_SPACE) and not jumping:
      var velocity = get_linear_velocity()
      velocity.y = JUMP_VEL
      set_linear_velocity(velocity)
      jumping = true
   #Section for basic movement.
   if Input.is_key_pressed(KEY_W):
      #translate(Vector3(0, 0, speed*delta))
      vel.z=speed*delta
   if Input.is_key_pressed(KEY_S):
      #translate(Vector3(0, 0, -speed*delta))
      vel.z=-speed*delta
   if Input.is_key_pressed(KEY_A):
      #translate(Vector3(speed*delta, 0, 0))
      vel.x=speed*delta
   if Input.is_key_pressed(KEY_D):
      #translate(Vector3(-speed*delta, 0, 0))
      vel.x=-speed*delta
   translate(vel)
   
   vel=VECTOR0
 
GreygДата: Пн, 07.05.2018, 06:50 | Сообщение # 6
Сержант
Группа: Пользователи
Сообщений: 22
Награды: 0
Репутация: 1
Статус: Оффлайн
Может get_global_transform()? он вроде для 3d RigidBody.
 
yraДата: Пн, 07.05.2018, 22:29 | Сообщение # 7
Сержант
Группа: Пользователи
Сообщений: 29
Награды: 0
Репутация: 15
Статус: Оффлайн
Нашел метод to_global - все равно ничего не получается. Надо разобраться со всеми этими transfor'мами и т.д.
 
skanersoftДата: Вт, 08.05.2018, 10:55 | Сообщение # 8
Админ
Группа: Администраторы
Сообщений: 30
Награды: 0
Репутация: 501
Статус: Оффлайн
Давай, я скоро тоже к 3D приду) Будем вместе разбираться)

Главный Админ Godot Engine Russia
 
yraДата: Чт, 10.05.2018, 23:40 | Сообщение # 9
Сержант
Группа: Пользователи
Сообщений: 29
Награды: 0
Репутация: 15
Статус: Оффлайн
Я только за )) Но только когда будем вместе разбираться?

Добавлено (09.05.2018, 00:13)
---------------------------------------------
Кодextends KinematicBody
const GRAVITY = -24.8var vel = Vector3()const MAX_SPEED = 20const JUMP_SPEED = 18const ACCEL= 4.5
var dir = Vector3()
const DEACCEL= 16const MAX_SLOPE_ANGLE = 40
var cameravar rotation_helper
var MOUSE_SENSITIVITY = 0.05
func _ready():    camera = $Rotation_Helper/Camera    rotation_helper = $Rotation_Helper
    Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
func _physics_process(delta):    process_input(delta)    process_movement(delta)
func process_input(delta):
    # ----------------------------------    # Walking    dir = Vector3()    var cam_xform = camera.get_global_transform()
    var input_movement_vector = Vector2()
    if Input.is_action_pressed("movement_forward"):        input_movement_vector.y += 1    if Input.is_action_pressed("movement_backward"):        input_movement_vector.y -= 1    if Input.is_action_pressed("movement_left"):        input_movement_vector.x -= 1    if Input.is_action_pressed("movement_right"):        input_movement_vector.x += 1
    input_movement_vector = input_movement_vector.normalized()
    dir += -cam_xform.basis.z.normalized() * input_movement_vector.y    dir += cam_xform.basis.x.normalized() * input_movement_vector.x    # ----------------------------------
    # ----------------------------------    # Jumping    if is_on_floor():        if Input.is_action_just_pressed("movement_jump"):            vel.y = JUMP_SPEED    # ----------------------------------
    # ----------------------------------    # Capturing/Freeing the cursor    if Input.is_action_just_pressed("ui_cancel"):        if Input.get_mouse_mode() == Input.MOUSE_MODE_VISIBLE:            Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)        else:            Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)    # ----------------------------------
func process_movement(delta):    dir.y = 0    dir = dir.normalized()
    vel.y += delta*GRAVITY
    var hvel = vel    hvel.y = 0
    var target = dir    target *= MAX_SPEED
    var accel    if dir.dot(hvel) > 0:        accel = ACCEL    else:        accel = DEACCEL
    hvel = hvel.linear_interpolate(target, accel*delta)    vel.x = hvel.x    vel.z = hvel.z    vel = move_and_slide(vel,Vector3(0,1,0), true, 0.05, 4, deg2rad(MAX_SLOPE_ANGLE))
func _input(event):    if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:        rotation_helper.rotate_x(deg2rad(event.relative.y * MOUSE_SENSITIVITY))        self.rotate_y(deg2rad(event.relative.x * MOUSE_SENSITIVITY * -1))
        var camera_rot = rotation_helper.rotation_degrees        camera_rot.x = clamp(camera_rot.x, -70, 70)        rotation_helper.rotation_degrees = camera_rot

Взято от сюда: http://docs.godotengine.org/en/latest/tutorials/3d/fps_tutorial/part_one.html
Но там используется KinematicBody, а я хочу запустить всё это дело с RigidBody . В любом случае этот код пригодиться.

Добавлено (09.05.2018, 01:11)
---------------------------------------------
Разобрался зачем нужен метод normalized: он сокращает длину вектора до единицы, это нужно чтобы движение по на искосок не было быстрее движения по осям координат.

Добавлено (10.05.2018, 23:17)
---------------------------------------------
Поменял rigid на kinematic body и скопировал скрипт с этого урока http://docs.godotengine.org/en/3.0/tutorials/3d/fps_tutorial/part_one.html теперь перемещение не работает,  т.е. нажимаю на клавиши w,a,s,d, space ничего не происходит, хотя камера реагирует на вращение мышки  wacko

Добавлено (10.05.2018, 23:40)
---------------------------------------------
Разобрался - это у меня косяк был с землей - переделал и всё заработало.

Сообщение отредактировал yra - Ср, 09.05.2018, 00:17
 
skanersoftДата: Пт, 11.05.2018, 10:52 | Сообщение # 10
Админ
Группа: Администраторы
Сообщений: 30
Награды: 0
Репутация: 501
Статус: Оффлайн
Сколько трудов вложено)) Скриншот хотя б покажи что сделал) Или там только кубики пока что?

Главный Админ Godot Engine Russia
 
yraДата: Пт, 11.05.2018, 11:03 | Сообщение # 11
Сержант
Группа: Пользователи
Сообщений: 29
Награды: 0
Репутация: 15
Статус: Оффлайн
Да, там пока смотреть не на что, но вот скриншот https://yadi.sk/i/4y_h8Ml63Vi5my Ну и паузу сделал: https://yadi.sk/i/BVD8XL293Vi5qD Меню показывать не могу, когда игра будет закончена, дам протестировать ))
 
skanersoftДата: Пт, 11.05.2018, 11:33 | Сообщение # 12
Админ
Группа: Администраторы
Сообщений: 30
Награды: 0
Репутация: 501
Статус: Оффлайн
Ух, это всё так интересно! Откуда взять времени заняться бы...

Главный Админ Godot Engine Russia
 
Форум » Godot Engine » FAQ (Частые Вопросы) » Как преобразовать локальные координаты в глобальные (сабж)
  • Страница 1 из 1
  • 1
Поиск: