Jump to content

Archived

This topic is now archived and is closed to further replies.

MrSergey

Кодим для X-Plane

Recommended Posts

MrSergey
Как обычно запутался в элементарном. Мне нужно чтобы значение из одного датарефа в реальном времени переводилось в значение другого с оговоркой что один градусы с минусами считает другой по кругу. Хочу что-бы psi головы следило за скольжением взглядом. как это в LUA ?

p.s. первая часть это предусмотрительное отключение того что ниже будет слайдером

 

начал так а вот вторая функция я встрял - мозг дым жара

 

defineProperty("slip",globalPropertyf("sim/cockpit2/gauges/indicators/sideslip_degrees"))

defineProperty("head",globalPropertyf("sim/graphics/view/pilots_head_psi"))

defineProperty("off",globalPropertyi("sim/cockpit2/switches/custom_slider_on[17]"))

 

function update()

    if get(off) ~= 0 then

head_control()

    end

end

 

function head_control()

    ????????????????

    end

 

Помогите зануды ))

Share this post


Link to post
Share on other sites
MrSergey

Пока сделал нервного пилота - рывками головой крутит, чего нет никого кто в теме? Или продавцы не скажут - покупатели не знают? Опять гуглить придётся )))

Share this post


Link to post
Share on other sites
utah77

А пилот — землянин?

Share this post


Link to post
Share on other sites
MrSergey

А пилот — землянин?

 Нет, но он тоже нервный ))  Короче сделал я его изначально дёрганным, потом нервно озирающимся, а вот теперь жду может Михаааа! Ау. Подскажи мантру на LUA чтобы он у меня головой крутил в сторону скольжения синхронно. мне до 90 +- нужно, так-как я скользить боком люблю  ) А поворачивать самому голову не

охота. Возможны варианты. Например обычно человек чует что началось скольжение поворачивает голову в ту сторону а потом опять возвращает её. Я всё равно

додумаю - расшевелить авсим просто охото... 

Share this post


Link to post
Share on other sites
mxkv67

Да я не совсем понял, что тебе надо, диапазон -180..180 в 0..360 перевести? Ну так если значение положительное, пишешь как есть, а если отрицательное, то 180-значение

 

Upd: Тьфу! То есть 360+значение. Вообще, мог бы и пораньше спросить, а не дожидаться, пока у меня час ночи пробьет.

Share this post


Link to post
Share on other sites
MrSergey

Да я не совсем понял, что тебе надо, диапазон -180..180 в 0..360 перевести? Ну так если значение положительное, пишешь как есть, а если отрицательное, то 180-значение

 

Upd: Тьфу! То есть 360+значение. Вообще, мог бы и пораньше спросить, а не дожидаться, пока у меня час ночи пробьет.

 Тебе не 120 лет чтоб спать со спокойными ночами ложиться )) Шучу. Вот мой вариант припадочной головы

 

defineProperty("slip",globalPropertyf("sim/cockpit2/gauges/indicators/sideslip_degrees"))
defineProperty("head",globalPropertyf("sim/graphics/view/pilots_head_psi"))
defineProperty("off",globalPropertyi("sim/cockpit2/switches/custom_slider_on[17]"))
 
 
function update()
    if get(off) ~= 0 then
head_control()
    end
end
 
function head_control()
    
if get(slip) < -30 then set(head, 330) else set(head, 335)
if get(slip) < -20 then set(head, 340) else set(head, 345)
if get(slip) < -10 then set(head, 350) else set(head, 355)
if get(slip) > 10 then set(head, 10) else set(head, 5)
if get(slip) > 20 then set(head, 20) else set(head, 15)
if get(slip) > 30 then set(head, 30) else set(head, 25)
end
end
end
end
end
end
 
end
 
я думаю можно сделать это с подобающим тебе уровнем в одну гениальную строчку. Это будет работать без разницы есть в самолёте оно или нет, тоесть
по сути как сторонний плагин можно использовать. Но мне не это нужно. Смысл крутить головой в сторону скольжения - бокового. Так ведут себя порядочные
головы которые хотят видеть куда скользят.
 
Но если завтра ответишь то всё равно хорошо. Мопед подарю - сломанный ) 

Share this post


Link to post
Share on other sites
mxkv67

Так пойдет?

 

function head_control()

if get(slip < 0) then set(head, 360+slip) else set(head, slip)

end

Share this post


Link to post
Share on other sites
MrSergey

Так пойдет?

 

function head_control()

if get(slip < 0) then set(head, 360+slip) else set(head, slip)

end

 Браво. Я проверю сейчас и отвечу что получилось.

Share this post


Link to post
Share on other sites
MrSergey

Не работает, ошибок нет. Просто что-то не додумано. Смысл мне уже ясен, можно пробовать метод тыка в этом твоём ключе,но что-то пока не так. Ноль реакции на скольжение  

Share this post


Link to post
Share on other sites
Maxxe

Тут интерполяция нужна. Я бы написал что-то типа такого:

 

 

function interpolate(x, xmin, xmax, ymin, ymax)
    if x< xmin then
        return ymin
    end
    
    if x> xmax then
        return ymax
    end
    
    return ymin + (x-xmin)/(xmax - xmin)*(ymax - ymin)

end

function head_control()

if (slip<0) then
    return interpolate(slip, 0, -30, 360, 330)
end


if (slip>0) then
    return interpolate(slip, 0, 30, 0, 25)
end

end

 

P.S. Это навскидку, нужно подумать будет ли правильно работать в отрицательных диапазонах и подхачить если что.

Share this post


Link to post
Share on other sites
AhJong

А есть какая-то возможность в лог вывести повременную расшифровку загрузки сима? Где-то стало теряться до минуты времени, не могу понять где. Есть подозрение что SASL долго загружается после загрузки C172 от Airfoil, но я не уверен, может дело в чем-то другом.

 

Отправлено с моего HTC6525LVW через Tapatalk

Share this post


Link to post
Share on other sites
MrSergey

P.S. Это навскидку, нужно подумать будет ли правильно работать в отрицательных диапазонах и подхачить если что.

  Я попробую, подскажу. Пока я чуть чуть поджёг свои мозги. Оно как заколдованное, не хочет. Причём я уже не уверен что это ошибки наши а не симулятора версии b2 . Всё равно спасибо за намёк, с интерполяцией пробовал но по другому. Сейчас твой метод  прикину - подскажу. 

Share this post


Link to post
Share on other sites
MrSergey

Не не работае
 

P.S. Это навскидку, нужно подумать будет ли правильно работать в отрицательных диапазонах и подхачить если что.

 Не не работает, потом  and пока внизу не поставишь он не будет работать, в серединах не работает с and.  Назову это прилично - не удобная архитектура )
А второе голова то где? head? оно у тебя интерполирует скольжение ну круто а нафига )) ? Надо додумать немного. У меня работает вот это безумие

[spoilerdefineProperty("slip",globalPropertyf("sim/cockpit2/gauges/indicators/sideslip_degrees"))

defineProperty("head",globalPropertyf("sim/graphics/view/pilots_head_psi"))
defineProperty("off",globalPropertyi("sim/cockpit2/switches/custom_slider_on[17]"))
 
function update()
    if get(off) ~= 0 then
head_control()
    end
end
 
function head_control()
if get(slip) < -90 then set(head, 270) else set(head, 0)
if get(slip) < -80 then set(head, 280) else set(head, 0)
if get(slip) < -70 then set(head, 290) else set(head, 0)
if get(slip) < -60 then set(head, 300) else set(head, 0)
if get(slip) < -50 then set(head, 310) else set(head, 0)
if get(slip) < -40 then set(head, 320) else set(head, 0)
if get(slip) < -30 then set(head, 330) else set(head, 0)
if get(slip) < -20 then set(head, 340) else set(head, 0)
if get(slip) < -10 then set(head, 350) else set(head, 0)
if get(slip) > 10 and get(slip) < 20 then set(head, 10) else set(head, 0)
if get(slip) > 20 and get(slip) < 30 then set(head, 20) else set(head, 0)
if get(slip) > 30 and get(slip) < 40 then set(head, 30) else set(head, 0)
if get(slip) > 40 and get(slip) < 50 then set(head, 40) else set(head, 0)
if get(slip) > 50 and get(slip) < 60 then set(head, 50) else set(head, 0)
if get(slip) > 60 and get(slip) < 70 then set(head, 60) else set(head, 0)
if get(slip) > 70 and get(slip) < 80 then set(head, 70) else set(head, 0)
if get(slip) > 80 and get(slip) < 90 then set(head, 80) else set(head, 0)
if get(slip) == 90 then set(head, 90) else set(head, 0)
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end

end]

 

и я уже начал находить его полезным, правда голова как у совы - тупил тупил развернул рывком ))

Share this post


Link to post
Share on other sites
atcstager

Не работает, ошибок нет. Просто что-то не додумано. Смысл мне уже ясен, можно пробовать метод тыка в этом твоём ключе,но что-то пока не так. Ноль реакции на скольжение  

Я пока не понял, что нужно получить

Если вертеть голову пилота пропорционально скольжению - то приравнять скольжению, умноженному на коэффициент по вкусу.

 

Если хочется ступеньчато, но не сильно резко, можно добавить сглаживание.

Share this post


Link to post
Share on other sites
atcstager

Распишу наверное, коль я правильно понял задачу.

Если просто привязать скольжение к повороту головы, то получится:
 

defineProperty("slip_deg", globalPropertyf("sim/cockpit2/gauges/indicators/slip_deg"))
defineProperty("head", globalPropertyf("sim/graphics/view/pilots_head_psi"))
 
function update()
  set(head, get(slip_deg))
end
 
Если чуток усовершенствовать, то можно добавить сглаживание и коэффициенты:
 
defineProperty("slip_deg", globalPropertyf("sim/cockpit2/gauges/indicators/slip_deg"))
defineProperty("head", globalPropertyf("sim/graphics/view/pilots_head_psi"))
 
smooth = 0         -- начальное значение, что бы не было null при первом кадре
k_turn = 2           -- крутилка для величины поворота головы, можно добавить минус для противоположного направления.
k_smooth = 0.1  -- крутилка для сглаживания. Чем меньше, тем плавнее.
 
function update()
  slip = get(slip_deg)  * k_turn
  smooth = smooth + (slip - smooth) * k_smooth
  set(head, smooth)
end
 
Но по большому счету скольжение не самая лучшая переменная для такой затеи. Можно попробовать использовать крен или там скорость разворота.
Можно еще поиграться с нелинейными функциями - квадратичной, синус и т.п. ЧТо бы в околонулевых значениях отклонение головы было меньше.
 
П.С. если нужно значение не в градусах, а в радианах, то поможет:
 
my_rad_var = math.rad(my_degrees_var)
 
Ну, или посмотреть коэффициент в любом конвертере величин.

Share this post


Link to post
Share on other sites
atcstager

УУУ. Вот заразили же :)

Попробовал таки в симе. Вылезли еще баги, напрямую не связанные - Не включался внешний вид и не крутилась голова мышей.  А также при переходе с внешнего вида (после исправления) голова повернута на 180 назад. Особо не вникал почему. А после правки мыши в крайней верхней и нижних точках обзора дрожал вид. 

Пришлось дополнять костылями:

 

defineProperty("slip_deg", globalPropertyf("sim/cockpit2/gauges/indicators/slip_deg"))
defineProperty("head", globalPropertyf("sim/graphics/view/pilots_head_psi"))
defineProperty("out", globalPropertyf("sim/graphics/view/view_is_external"))
defineProperty("pitch", globalPropertyf("sim/graphics/view/pilots_head_the"))
 
smooth = 0
k_turn = -2
k_smooth = 0.1
smooth_last = 0
delta = 0
key = 1
 
function update()
 
 if get(out) == 0 then 
  slip = get(slip_deg) * k_turn
  smooth = smooth + (slip - smooth) * k_smooth
  delta = smooth - smooth_last  
  smooth_last = smooth
  set(head, get(head) + delta)
 end
 
 if get(out) == 0 and key == 1 then
  set(head, 0)
  key = 0
 
  elseif get(out) ~= 0 then
  key = 1
 end
 
 if get(pitch) > 80 then set(pitch, 80) end
 if get(pitch) < -80 then set(pitch, -80) end
 
end

Share this post


Link to post
Share on other sites
mxkv67

Не включается внешний вид - это, типа, фича. На самом деле при прописывании поворота головы принудительно включается внутренний вид, по этому перед тем как прописать надо посмотреть какой сейчас вид и если внешний, то после прописывания восстановить.

Share this post


Link to post
Share on other sites
MrSergey

 

УУУ. Вот заразили же :)

 

 Последний твой код работает блистательно! , я его немного усложнил кнопкой отключения, но меня Михаила сообщение настораживает.

Согласись в полёте с ним чувствуешь себя живым? Так вот!  Я думаю тема не помешает здесь подобная. Назвать типа "кривокодеры идут на помощь"  ))) 

 

 Вообще спасибо всем, по ситуации рабочий у skyteacher 1 место

рабочий с функцией голова - сова Sergey747 2 место

гениальный, но не рабочий Михаил и Маxx разделят почётное третье место если щас не выдас ко-то шедевр

 

Пожелание убрать реакцию на кнопки Q E клавиатуры так - как они залипают при активации кода

Share this post


Link to post
Share on other sites
mxkv67

Да я LUA и скриптовые языки практически не знаю (но догадываюсь, что если хочешь, чтоб функция посередине закончилась, надо ставить "return", а не  "end" :)), мне и третье место, считай, халява :)

Share this post


Link to post
Share on other sites
MrSergey

Да я LUA и скриптовые языки практически не знаю (но догадываюсь, что если хочешь, чтоб функция посередине закончилась, надо ставить "return", а не  "end" :)), мне и третье место, считай, халява :)

 Про retutn не догнал немного - поясни на примере вот я уже немного поправил по алфавиту, заменил некоторые повторяющиеся слова синонимами - проверил

работает + возможность отключить назначив на слайдер или сделав кнопку как у меня

 

 defineProperty("head", globalPropertyf("sim/graphics/view/pilots_head_psi"))

defineProperty("off",globalPropertyi("sim/cockpit2/switches/custom_slider_on[17]"))
defineProperty("out", globalPropertyf("sim/graphics/view/view_is_external"))
defineProperty("pitch", globalPropertyf("sim/graphics/view/pilots_head_the"))
defineProperty("slip", globalPropertyf("sim/cockpit2/gauges/indicators/slip_deg"))
 
function update()
    if get(off) ~= 0 then
head_control()
    end
end
 
smooth = 0
turn = -2
sleek = 0.1
calm = 0
delta = 0
key = 1
 
function head_control()
 
 if get(out) == 0 then 
  glide = get(slip) * turn
  smooth = smooth + (glide - smooth) * sleek
  delta = smooth - calm  
  calm = smooth
  set(head, get(head) + delta)
 end
 
 if get(out) == 0 and key == 1 then
  set(head, 0)
  key = 0
 
  elseif get(out) ~= 0 then
  key = 1
 end
 
 if get(pitch) > 80 then set(pitch, 80) end
 if get(pitch) < -80 then set(pitch, -80) end
 
end

Share this post


Link to post
Share on other sites
MrSergey

третье место почётное - вообще первым быть вредно, это начало деградации )

Share this post


Link to post
Share on other sites
utah77

Тема для кодеров, чтобы не забивать другие разделы.

Share this post


Link to post
Share on other sites
MrSergey

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

 

  Модель где это будет реализовано в законченном варианте

я могу позже выложить - учтите у меня странные фантазии и опасный юмор

 

Всех соавторов могу указать в acf но я думаю они пожелают не светиться в моих граничащих с цинизмом, а посути цинизмом высмеивающие глупость шедеврах )

 

Позже раз уж я плагин поставил, думаю у меня в модели начнут скрипеть двери и зубы пилота ( ну это так - лирика )

Share this post


Link to post
Share on other sites
MrSergey

  Вот видео как оно у меня работает. Намеренно не делал 16:9 соотношение картинки чтоб оценить без иллюзий. У меня монитор 4:3 а растягивать для его величества ютуб не хочу, картинка получается не полноценная или растянутая. По мне вполне полезный плагин вы написали - трекир не нужен ))

 

 

Share this post


Link to post
Share on other sites
atcstager

 Последний твой код работает блистательно! , я его немного усложнил кнопкой отключения, но меня Михаила сообщение настораживает.

Пожелание убрать реакцию на кнопки Q E клавиатуры так - как они залипают при активации кода

Пусть не настораживает. Да, если что то вписать в переменные головы, то вид сбрасывается на внутренний, поэтому нужно проверять (что я и сделал).

Кнопками Q и E не пользовался, поэтому не заметил.

Нужно прописать их команды, а потом добавлять в общую кучу.(Как вариант)

 

Взгляд на горизонте можно держать, просто писать в тангаж головы тангаж ЛА. Выглядеть в коде будет аналогично повороту.

Share this post


Link to post
Share on other sites

×
×
  • Create New...