Assetto Corsaで同一PC上の自鯖に入る方法

一応まとめておく。

Visual C++のプロジェクトをVimでビルドする

以前の設定だと、エラーメッセージを拾えずジャンプも出来なかった。出力内容を確認すると、C#の場合、エラーなどのメッセージに(行,桁)が含まれているのに対して、C++の場合は(行)のみになっている。これくらい同じフォーマットに揃えてくれればいいのになぁ。

ということで以下のように修正して、VC++のプロジェクトも快適にVimでコーディング&ビルド出来るようになりました。

$VIMRUNTIME/compiler/msbuild.vim

if exists("current_compiler")
  finish
endif
let current_compiler = "msbuild"

if exists(":CompilerSet") != 2
  command -nargs=* CompilerSet setlocal <args>
endif

CompilerSet errorformat=
  \%E%f(%l):\ error\ %m,   " 今回の追加部分
  \%W%f(%l):\ warning\ %m, " 今回の追加部分
  \%E%f(%l\\,%c):\ error\ %m,
  \%W%f(%l\\,%c):\ warning\ %m,
  \%-G%.%#

CompilerSet makeprg=MSBuild
  \\ /nologo
  \\ /consoleloggerparameters:
    \NoItemAndPropertyList;
    \ForceNoAlign; 

$VIM/vimrcに記述

autocmd BufNewFile,BufRead *.sln,*.vcproj,*.csproj,*.xaml :set filetype=xml
autocmd BufNewFile,BufRead *.sln,*.vcproj,*.cpp,*.hpp,*.c,*.h,*.csproj,*.cs,*.xaml :compiler msbuild
autocmd FileType xml :set fileencoding=utf-8
autocmd FileType xml :set encoding=cp932

「その他」最近全く自宅でコーディングする時間が無い

まあ、ゲームとかで時間を浪費してるからなんですけどね。麻雀とか、元気があればrFactorとか。かといって仕事でバリバリコード書きまくってるのかといえばそうでもなく、仕事は会議とか会議とか会議とか。Twitterクライアント作ろうかなんて思ってたけど、その程度の時間も最近取れないんで、当分保留つうことで。

レーシングシムごとの物理エンジン性能比較

2chrFactor本スレで気になる記事についての書き込みがあったので、適当に訳してみようかと思ったが、ここんとこアクセス規制で書き込めないことを思い出し、むずかしいえいごがにがてなのもおもいだし、ちょっと凹んだので要点だけ抜き出してみた。

Tech Stuff – Physic Engine Rates – VirtualR.net – 100% Independent Sim Racing News

この記事によると、RSC(Race Sim Central)のユーザ「Bob Smith」なる人物が「各種レーシングシミュレータがそれぞれ1秒間の間に何回物理シミュレーションを行っているか」というデータを公開したらしい。もちろん、このデータがどの程度の信憑性を持つものなのかは分からないし、紹介している記事の中でも「データにある値が高い(シミュレーション回数が多い)からといって、それが優れたシミュレータであることを示すとは限らない」と釘を刺している。
真面目ぶって、そんな前置きも一応書きつつ以下のデータを見てみようじゃないか。

発売年 タイトル 車両の挙動 衝突検出 タイヤ特性
1998 Sports Car GT 50Hz N/A
1998 Viper Racing 60Hz*1 N/A
1998 Grand Prix Legends 288Hz N/A
2000 F1 2000 50Hz N/A
2000~2008 Racer 300Hz 3000Hz~30,000Hz
2001 F1 2001 200Hz N/A
2002 Total Immersion Racing 100Hz*2 N/A
2002~2008 Live For Speed 100Hz 2000Hz
2003 NASCAR Racing 2003 Season 288Hz*3 N/A
2004 VirtualRC Racing v1.0 300Hz 600Hz
2005 VirtualRC Racing v3.0 250Hz 500Hz または 1000Hz
2005 rFactor 400Hz N/A
2006 Test Drive Unlimited 1000Hz 100Hz N/A
2006 netKar Pro 333Hz N/A
2007 Forza Motorsport 2 360Hz N/A
2008 Ferrari Challenge: Trofeo Pirelli 60Hz N/A
2008 iRacing 360Hz N/A
開発中 Motorsport 333Hz N/A

最後の一文の意味が良く分からないが、紹介記事では結論として以下のようにまとめている。

これらの数字はかなり興味深い。ISIが「Sports Car GT」から「rFactor」にかけて大躍進しているあたりが特に。そして「Forza Motorsport 2」が賞賛された「iRacing」と同じくらい速い物理エンジンを搭載しているなんて誰が思っただろう?残念なのは「Gran Turismo」と「Simbin」の各種タイトルに関するデータが全く無いことだ。それらは「rFactor」のデータの周りにあるべきである。

これを見て、まず面白いなと自分が思ったのは以下の点。

  • Forza Motorsport 2」など最近はコンシューマ機で発売されたレースシムがその物理エンジン性能を高らかに謳っているケースが多いが、ところがどっこいPCゲームのレースシムには30,000Hz(!)などという意味があるのか分からない恐ろしい回数でシミュレーションを行っているタイトルがある。
  • タイヤ特性のシミュレーションに定評のある「Live For Speed」を筆頭に、車両の挙動シミュレーションよりも高解像でタイヤモデルの計算を行っているシムが意外と多い。しかし、そういうタイトルに限ってどれもマイナーなのはどういうことだ!
  • 数値とタイトルの一般的な評価を考えると、明らかにこれらの数値とレースシムとしての優秀さには全く相関関係がない。あらかじめ断られてたとは言え、これじゃあまりに不憫じゃありませんか。
  • 結局のところ総合すると「売れる」レースシムを作るには車両の物理シミュレーションを100~400Hz程度の速度で、それ以上作りこみ過ぎず、ほどほどに行えばいいようである。だから何?とか聞いてはいけません。

個人的にも見て興味深いデータだった。こういうのってなかなか表には公開されないしね。

*1:部分的に300Hzで計算

*2:内部計算は実質400Hzに相当するらしい

*3:推定値

視界の揺れを調整する方法

こっちは今でも需要があるようなので、もひとつサルベージ。
(以下、2006/11の記事です)

rFactorの視界の揺れを無くす、または調整する方法をまとめてみました。
まず基本的な方法ですが、"C:/Program Files/rFactor/UserData/プロファイル名/プロファイル名.PLR"をメモ帳などのテキストエディタで開き、以下の行を探して編集します。

Cockpit Vibration Mult1="1.00000"
Cockpit Vibration Freq1="31.00000"
Cockpit Vibration Mult2="1.00000"
Cockpit Vibration Freq2="37.00000"

それぞれ行末に説明がコメントで書かれているんですが、読んでも何のことやらよく分からないので無視です。とりあえず完全に揺れを無くす場合は、1行目と3行目を"0.00000"にすればOKです(全て"0.00000"にしてもOK)

Cockpit Vibration Mult1="0.00000"
Cockpit Vibration Freq1="31.00000"
Cockpit Vibration Mult2="0.00000"
Cockpit Vibration Freq2="37.00000"

自分もこの設定で走ってましたが、ぬるぬるで走りやすい反面、雰囲気が損なわれるのでほどよい揺れ具合を求めて試行錯誤してみました。まず、それぞれの行がどういう効果をもたらしているのかを確かめるため、1行ずつ"0.00000"にして走ってみると、どうやら次のような感じらしい。

Cockpit Vibration Mult1 = 車体を基点に視点が揺れる度合い
Cockpit Vibration Freq1 = 上記エフェクトの周波数
Cockpit Vibration Mult2 = 地面を基点に視点が揺れる度合い
Cockpit Vibration Freq2 = 上記エフェクトの周波数

まず、Mult1を"1.00000"、Mult2を"0.00000"で走ってみました。地面に対して視点は動いていないんですが、画面上でコクピットがぐわんぐわん揺れますw この設定はすごく酔いやすそうです。というか実際、酔ったので却下・・・w
次に、Mult1を"0.00000"、Mult2を"1.00000"で走ってみました。この設定の場合、高速で走ると地面に対して視点が揺れますがコクピットが動かないため、走りやすいまま雰囲気が出せるようです。ということで調整を繰り返した結果、次のような設定に落ち着きました。

Cockpit Vibration Mult1="0.00000"
Cockpit Vibration Freq1="0.00000"
Cockpit Vibration Mult2="0.20000"
Cockpit Vibration Freq2="50.00000"

揺れを残したまま走りやすくしたい、という方はぜひ試してみて下さい。もっといい設定が見つかった場合、教えていただけると幸いです。

2006/11/03 追記
上記設定は、CTDP F1 2005で最適になるように調整してます。V8など箱車メインの方はMult2を少し大きめの数値にすると、いい結果になるんじゃないかと思います。

動的な関数追加を行えるクラス(PHP4/5両対応)

だーいぶ前に別のブログに書いた記事ですが、久しぶりに覗いてみたらまだ残ってたので、役に立つとも思えないけどサルベージしてみた。

<?php
class dynamic_func_class {
    function dynamic_func_class() {
        if (version_compare(PHP_VERSION, 5.0, '<'))
            overload(get_class($this));
    }
    function get_dynamic_func($class, $func) {
        return dynamic_func_class::ref_dynamic_func(false, $class, $func);
    }
    function set_dynamic_func($class, $func, $args, $code) {
        dynamic_func_class::ref_dynamic_func(true, $class, $func, $args, $code);
    }
    function remove_dynamic_func($class, $func) {
        dynamic_func_class::ref_dynamic_func(true, $class, $func, "", "");
    }
    function ref_dynamic_func($set, $class, $func, $args = null, $code = null) {
        static $_ = array();
        $class = strtolower($class);
        if ($set) {
            if (class_exists($class))
                $_[$class][$func] = create_function($args, $code);
        } else {
            if (empty($_[$class][$func])) {
                $class = strtolower(get_parent_class($class));
                if ($class != 'df')
                    return dynamic_func_class::get_dynamic_func($class, $func);
            }
            else
                return $_[$class][$func];
        }
    }
    function __call($func, $args) {
        $f = dynamic_func_class::get_dynamic_func(get_class($this), $func);
        if (is_callable($f))
            return call_user_func_array($f, $args);
    }
}
 
// 対象のクラスは上記のクラスを継承する必要がある
class A extends dynamic_func_class {
    function A() { parent::dynamic_func_class(); } // 基底クラスのコンストラクタを必ず呼ぶ
}
$a =& new A();
 
// メンバ関数を追加する前にコールしてみる
echo @$a->fn();
// php4 => 
// php5 => 
 
// メンバ関数を動的に追加してコールする
A::set_dynamic_func('A', 'fn', '$a', 'return $a * $a;'); // function fn($a) { return $a * $a; }
echo @$a->fn(2); // echo 2 * 2;
// php4 => (PHP4では戻り値を取れない)
// php5 => 4
 
// (C) 別の関数を同名で上書きする
A::set_dynamic_func('A', 'fn', '$a, $b', '$b = $a * $a;'); // function fn($a, $b) { $b = $a * $a; }
@$a->fn(3, &$c); // $c = 3 * 3;
echo $c;
// php4 => 9
// php5 => 9
 
// (D) 派生クラスにも追加したメンバ関数は有効
class B extends A {
    function B() { parent::A(); } // 基底クラスのコンストラクタを必ず呼ぶ
}
$b =& new B();
@$b->fn(4, &$d); // $d = 4 * 4;
echo $d;
// php4 => 16
// php5 => 16
 
// (E) 派生クラスでメンバ関数を無効にする
B::remove_dynamic_func('B', 'fn');
@$b->fn(5, &$e); // $e = 5 * 5;
echo $e;
// php4 => 
// php5 => 
 
// (F) 派生元ではまだ有効
@$a->fn(6, &$f);
echo $f;
// php4 => 36
// php5 => 36

うーん、素直にPHP5使うべきだ。