Кодим для X-Plane — X-Plane Общий форум

Как обычно запутался в элементарном. Мне нужно чтобы значение из одного датарефа в реальном времени переводилось в значение другого с оговоркой что один градусы с минусами считает другой по кругу. Хочу что-бы 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
 
Помогите зануды ))

Ответов: 51

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

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

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

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

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

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

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

 

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

Сообщение отредактировано mxkv67: 21 June 2016 — 20:05

Да я не совсем понял, что тебе надо, диапазон -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
 
я думаю можно сделать это с подобающим тебе уровнем в одну гениальную строчку. Это будет работать без разницы есть в самолёте оно или нет, тоесть
по сути как сторонний плагин можно использовать. Но мне не это нужно. Смысл крутить головой в сторону скольжения — бокового. Так ведут себя порядочные
головы которые хотят видеть куда скользят.
 
Но если завтра ответишь то всё равно хорошо. Мопед подарю — сломанный ) 

Так пойдет?

 

function head_control()

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

end

Так пойдет?

 

function head_control()

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

end

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

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

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

 

 

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. Это навскидку, нужно подумать будет ли правильно работать в отрицательных диапазонах и подхачить если что.

Сообщение отредактировано Maxxe: 21 June 2016 — 23:45

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

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

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

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

Не не работае
 

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][/spoiler]

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

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

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

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

 

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

Сообщение отредактировано skyteacher: 22 June 2016 — 02:05

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

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

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)
 
Ну, или посмотреть коэффициент в любом конвертере величин.

Сообщение отредактировано skyteacher: 22 June 2016 — 03:47

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

Попробовал таки в симе. Вылезли еще баги, напрямую не связанные — Не включался внешний вид и не крутилась голова мышей.  А также при переходе с внешнего вида (после исправления) голова повернута на 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

Сообщение отредактировано skyteacher: 22 June 2016 — 06:03

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

 

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

 

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

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

 

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

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

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

 

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

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

Да я 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

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

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

 

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

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

 

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

 

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

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

 

 

Сообщение отредактировано Sergey747: 22 June 2016 — 13:45

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

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

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

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

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

 

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

Сообщение отредактировано skyteacher: 22 June 2016 — 15:44

Взгляд на горизонте можно держать, 

 Вообще полезный код и держать им можно что угодно. скажем можно вектор тяги привязать к скорости ниже той минимальной которую удерживают крылья и чтоб он выкручивался в состояние зависания синхронно со скоростью компенсируя потерю крыльями сил для полёта — получиться некий безопасный VTOL . Можно ещё до кучи обнулять скольжения и получиться физика FSX ) Это полезные буквы так-как при наличии фантазии

можно расширить функционал  plane-maker страницы с настройками совместных отклонений. Поэтому нужно его под спойлер как работающий, эффективный

и полезный. Коды можно в первое сообщение форума и закрепить на всех страницах. Чтоб каждый желающий глянул и нашёл что хотел или довести до ума

и пере сохранить если автор позволяет

функция обратной пропорциональности в LUA как её изобразить -то? где 90=0 для одного датарефа а 0=90 для другого. Типа скорость 88 то вектор 2 градуса или вектор 88 скорость 2узла. Засвербило поднять безопасность векторной тяги )