ズームプログラム – FlyWithLua

65行目の数値を変更するとズームの位置を変更できる。
64行目を有効にするとズームが繰り返し表示される。

Mac用

zoom以外は位置がしっかり分かってから有効にすること。

local ffi = require("ffi")
--local XPLM = ffi.load("XPLM_64")--これがMacでのエラーの原因(これを入れたままだとX-Planeクラッシュ)
--////////////Macはエラーになるので以下を入れると問題なくなる-----------------------------
local ffi = require("ffi")
local XPLM = nil
local XPLMlib = "XPLM"
if SYSTEM_ARCHITECTURE == 64 then
    if SYSTEM == "IBM" then
        XPLMlib = "XPLM_64"
    elseif SYSTEM == "LIN" then
        XPLMlib = "Resources/plugins/XPLM_64.so"
    else
        XPLMlib = "Resources/plugins/XPLM.framework/XPLM"
    end
else
    if SYSTEM == "IBM" then
        XPLMlib = "XPLM"
    elseif SYSTEM == "LIN" then
        XPLMlib = "Resources/plugins/XPLM.so"
    else
        XPLMlib = "Resources/plugins/XPLM.framework/XPLM"
    end
end
XPLM = ffi.load(XPLMlib)
ffi.cdef("typedef void * XPLMDataRef;")
ffi.cdef("XPLMDataRef XPLMFindDataRef(const char * inDataRefName);")
ffi.cdef("int XPLMGetDatai(XPLMDataRef inDataRef);")
ffi.cdef("void XPLMSetDatai(XPLMDataRef inDataRef, int inValue);")
ffi.cdef("float XPLMGetDataf(XPLMDataRef inDataRef);")
ffi.cdef("void XPLMSetDataf(XPLMDataRef inDataRef, float inValue);")
ffi.cdef("double XPLMGetDatad(XPLMDataRef inDataRef);")
ffi.cdef("void XPLMSetDatad(XPLMDataRef inDataRef, double inValue);")
----------------------------------------------------------------------------------


-- All the C defs are from
-- http://www.xsquawkbox.net/xpsdk/mediawiki/Category:XPLMCamera
ffi.cdef([[typedef struct {
  float x;
  float y;
  float z;
  float pitch;
  float heading;
  float roll;
  float zoom;
} XPLMCameraPosition_t;

typedef int (* XPLMCameraControl_f)(
  XPLMCameraPosition_t * outCameraPosition,    /* Can be NULL */
  int inIsLosingControl,
  void *inRefcon);

void XPLMControlCamera(
  int inHowLong,
  XPLMCameraControl_f inControlFunc,
  void *inRefcon);

void XPLMReadCameraPosition(XPLMCameraPosition_t * outCamPos);
]])

function camControl(pos, isLosingControl, refcon)
    logMsg("[cam control] zoom is " .. pos.zoom)
    --pos.zoom = pos.zoom + .1
    ---if pos.zoom > 20 then
    pos.x = 37894.04
    pos.y = 173.47641
    pos.z = 31487.572
    pos.pitch = 0
    pos.heading = 0
    pos.roll = 0
    pos.zoom = 1
    --end
    return 1
end

XPLM.XPLMControlCamera(1, camControl, nil)

https://forums.x-plane.org/index.php?/forums/topic/93013-reading-changing-zoom-using-flywithlua/
Macではそのまま実行するとエラーになる。
以下を追加してlocal XPLM = ffi.load(“XPLM_64”)を外すと実行できる。
これはzoomを実行していて、少しずつアップになりある程度まで行くともとに戻り、またズームが繰り返し実行される。
https://forums.x-plane.org/index.php?/forums/topic/123247-ffiloadxplm-on-mac/

Windows用

local ffi = require("ffi")
local XPLM = ffi.load("XPLM_64")

-- All the C defs are from
-- http://www.xsquawkbox.net/xpsdk/mediawiki/Category:XPLMCamera
ffi.cdef([[typedef struct {
  float x;
  float y;
  float z;
  float pitch;
  float heading;
  float roll;
  float zoom;
} XPLMCameraPosition_t;

typedef int (* XPLMCameraControl_f)(
  XPLMCameraPosition_t * outCameraPosition,    /* Can be NULL */
  int inIsLosingControl,
  void *inRefcon);

void XPLMControlCamera(
  int inHowLong,
  XPLMCameraControl_f inControlFunc,
  void *inRefcon);

void XPLMReadCameraPosition(XPLMCameraPosition_t * outCamPos);
]])

function camControl(pos, isLosingControl, refcon)
	logMsg("[cam control] zoom is " .. pos.zoom)
	--pos.zoom = pos.zoom + .1
	--if pos.zoom > 20 then
	pos.x = 37894.04
    pos.y = 173.47641
    pos.z = 31487.572
    pos.pitch = 0
    pos.heading = 0
    pos.roll = 0
    pos.zoom = 1
	--end
	return 1
end

XPLM.XPLMControlCamera(1, camControl, nil)

参考dataref

–sim/graphics/view/cockpit_roll
–sim/graphics/view/cockpit_heading
–sim/graphics/view/cockpit_pitch
sim/graphics/view/view_heading
sim/graphics/view/view_pitch
sim/graphics/view/view_roll
sim/graphics/view/view_x
sim/graphics/view/view_y
sim/graphics/view/view_z