最近、私はバス運転シミュレータを再生しています。私にはクラッチペダルがないレーシングホイールがあるので、マウスをクラッチ、ブレーキ、ガスでジョイスティックとして動作させる方法を模索しました。私は、vJoyとFreePIE - Programmable Input Emulatorのソリューションを見つけました。私は、三ペダルホイールに2ペダルロジクールホイールを変換する方法の面で解決策をグーグルで始めたので、私は、Pythonに非常に新しいですLogitechのレーシングホイールからPython経由で軸情報を取得
#Title :OMSI 2 Freepie Mouse (Edited Mjoy vJoy FreePIE python script)
#Version :0.1 (2016-03-22)
#Author :snp, NEMOROSUS
#Description :FreePIE python script for OMSI 2 mouse controls such as acceleration, steering and clutch control that is more accurate that the built-in one.
import time
from System import Int16
from ctypes import windll, Structure, c_ulong, byref, CDLL
class POINT(Structure):
_fields_ = [("x", c_ulong), ("y", c_ulong)]
if starting:
vJoy0_stat = 1
vJoy[0].x = 0
vJoy[0].y = 0
vJoy[0].z = 0
x = 0
y = 0
z = 0
mouse_x = 0
mouse_y = 0
mouse_z = 0
mouse_x_locked = 0
mouse_y_locked = 0
x_m = 0
y_m = 0
axis_max = 16448
screen_x = windll.user32.GetSystemMetrics(0)
screen_y = windll.user32.GetSystemMetrics(1)
pt = POINT()
sequence = 0
system.setThreadTiming(TimingTypes.HighresSystemTimer)
system.threadExecutionInterval = 1
z += mouse.wheel * 10
# X/Y axis centering
#if keyboard.getKeyDown(Key.Space):
#windll.user32.SetCursorPos((screen_x/2),(screen_y/2))
# Mjoy vJoy
# Turn VJoy on/off
if keyboard.getPressed(Key.K):
if sequence == 0:
vJoy0_stat = 0
elif sequence == 1:
vJoy0_stat = 1
sequence = sequence + 1
if sequence > 1:
sequence = 0
if vJoy0_stat == 1:
windll.user32.GetCursorPos(byref(pt))
mouse_x = pt.x
mouse_y = pt.y
sensitivity = 28
x_m = (mouse_x - (screen_x/2)) * sensitivity
y_m = (mouse_y - (screen_y/2)) * sensitivity/0.66
x_both = x_m + x
y_both = y_m + y
x_keyb_sensitivity = 350
y_keyb_sensitivity = 350
if x_m > axis_max:
x_m = axis_max
if x_m < - axis_max:
x_m = - axis_max
if y_m > axis_max:
y_m = axis_max
if y_m < - axis_max:
y_m = - axis_max
if x > axis_max:
x = axis_max
if x < - axis_max:
x = - axis_max
if y > axis_max:
y = axis_max
if y < - axis_max:
y = - axis_max
if z > axis_max:
z = axis_max
if z < - axis_max:
z = - axis_max
if x_both > axis_max:
x_both = axis_max
if x_both < - axis_max:
x_both = - axis_max
if y_both > axis_max:
y_both = axis_max
if y_both < - axis_max:
y_both = - axis_max
vJoy[0].x = x_m + x
vJoy[0].y = y_m + y
vJoy[0].z = z
# Diag
diagnostics.watch(screen_x)
diagnostics.watch(screen_y)
diagnostics.watch(mouse_x)
diagnostics.watch(mouse_y)
diagnostics.watch(mouse_x_locked)
diagnostics.watch(mouse_y_locked)
diagnostics.watch(vJoy[0].x)
diagnostics.watch(vJoy[0].y)
diagnostics.watch(vJoy[0].z)
:私は、マウスのために完璧に動作例を見つけました。 vJoyを「最終的な」ジョイスティックとして使用するというアイデアを思いつきました。私は車輪からのすべての軸とマウスからのY軸へのフィードを計画しました。これはクラッチとして機能します。
from ctypes import CDLL
_glfw = CDLL("path_to_FreePIE_installation\\plugins\\lib-mingw-w64\\glfw3.dll")
joyNum = 0
isHere = _glfw.glfwJoystickPresent(joyNum)
diagnostics.watch(isHere)
joyName = _glfw.glfwGetJoystickName(joyNum)
diagnostics.watch(joyName)
#joy = _glfw.glfwGetJoystickAxes(0)
#joy = _glfw.glfwGetJoystickButtons(0)
#diagnostics.watch(joy)
私はthis documentationとthis documentationからアイデアを取った:だから、解決策を検索した後、私はPythonコードのこの作品を追加しました。彼らは、joyNumは0から15の間でなければならないと言っています。私は0から15まで、そして16から17までのすべての数字を試しました。毎回、isHereは0ですが、ホイールを私の3つのUSBポートラップトップ。私は同じ結果を得て3つすべてにそれをつけようとしました。 _glfw.glfwGetJoystickName(joyNum)
も毎回私に0を与えています。誰かがこれをデバッグするのを助けることができますか?私はなぜそれがホイールを見つけることができないのか分かりません。今は問題なくゲームをプレイできるので、ドライバーにとって問題はありません。ホイールは正常に動作しています。
私は_glfw.glfwGetJoystickAxes(0)
または_glfw.glfwGetJoystickButtons(0)
を呼び出そう - FreePIEがクラッシュし、私はVS2010でそれをデバッグするとき、例外メッセージは、次のとおりです。「保護されたメモリを読み書きしようとしました。これは、多くの場合、他のメモリが破損していることを示しています。。」
EDIT:今
from ctypes import CDLL, POINTER, c_float, c_int
glfw = CDLL("path_to_FreePIE_installation\\plugins\\lib-mingw-w64\\glfw3.dll")
joyNum = 0
isHere = _glfw.glfwJoystickPresent(joyNum)
diagnostics.watch(isHere)
joyName = _glfw.glfwGetJoystickName(joyNum)
diagnostics.watch(joyName)
cnt = c_int(0)
_glfw.glfwGetJoystickAxes.restype = POINTER(c_float)
joy = _glfw.glfwGetJoystickAxes(0, byref(cnt))
diagnostics.watch(joy)
axes = [joy[i].value for i in range(cnt)]
diagnostics.watch(cnt)
diagnostics.watch(axes)
スクリプトがまったく実行されていないと、私は次のエラーを参照してください。私はanother documentationを詳しく見ていたし、私はこの1つで追加されたコードを置き換え
FreePIEのコンソールで:
range()期待された整数の終わりの引数は、c_longを持っています。 この行でエラーが発生します。 axes = [joy [i] .value in i(cnt)]
私は混乱します。 Here軸の値を取得する方法の例を示しました。これは、自分のサイトからの抜粋です:あなたがここに見ることができるように
def glfwGetJoystickAxes(joy):
count = c_int(0)
_glfw.glfwGetJoystickAxes.restype = POINTER(c_float)
c_axes = _glfw.glfwGetJoystickAxes(joy, byref(count))
axes = [c_axes[i].value for i in range(count)]
、カウントはタイプc_intのであり、彼らはrange()
にそれを与えると、彼らはそれが動作するはずです。あるいは、私のコードスニペットのjoy [i] .valueがc_long型であり、その場合ですか?
ご協力いただきますようお願い申し上げます。ありがとう!
EDIT2:このような状況に陥ることがあり、誰のために
、。説明したようにglfw 1.4.0
:
if starting:
# ...
_glfw.glfwInit() # this is VERY important!
joyNum = 1 # not 0, because the mouse appears to be joystick No 0
# ...
if vJoy0_stat == 1: # the main loop
# ...
isHere = _glfw.glfwJoystickPresent(joyNum)
diagnostics.watch(isHere)
if isHere == 1:
cnt = c_int(0) # must be of type c_int!
_glfw.glfwGetJoystickAxes.restype = POINTER(c_float) # VERY important!
joy = _glfw.glfwGetJoystickAxes(joyNum, byref(cnt))
diagnostics.watch(joy[0]) # this appears to be the steering axe
diagnostics.watch(joy[1]) # this appears to be the two pedals combined in one axe
# from here I will do sth like:
windll.user32.GetCursorPos(byref(pt))
mouse_y = pt.y
y_m = (mouse_y - (screen_y/2)) * sensitivity/0.66
vJoy[0].x = joy[0]
vJoy[0].y = joy[1]
vJoy[0].z = y_m
ありがとうございました! :) あなたは私の命を救いました!これは近い将来に私がおそらく考えていないものです。少なくとも今のところ、それは私の問題の解決策であるようです。私はisHere = _glfw.glfwJoystickPresent(joyNum)の前に_glfw.glfwInit()を追加しました。今isHere = 1とjoyName =を9桁の数字に変換します。この最後のことは私には奇妙に思えます。私はそれが文字列名であることを期待しました。とにかく、私は今、軸を取得しようとします。どうもありがとう! – user2177283
それはあなたを助けてくれてうれしいです。しかし、私はあなたのDLLバインディングを使用する代わりにPythonモジュールを使用することをお勧めします。必要に応じて改善提案することもできます –