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