2018年12月22日

Unityでウィンドウが非アクティブでもジョイパッドの入力を取得する方法

Unityの標準機能ではウィンドウが非アクティブ状態だとジョイパッドの入力が取得できませんが、XInput経由で取得するとウィンドウのアクティブ状態からの影響は受けません。

VisualStudio2017/C++のソースコードと、Unity2018.2.7f1(64bit)用のサンプルプロジェクトを以下に入れていますので、ご自由にお使いください。ライセンスは以下のNYSLとします。


なお、サンプルコードでは取得した値をそのまま表示していますが、トリガーとスティックの値はコントローラによってニュートラル状態でも中央値からブレたりズレていたり、最大値にまでならないものがありますので、閾値で適当に判断してください。

詳細は、


こちらを確認してください。


■ライセンス


A. 本ソフトウェアは Everyone'sWare です。このソフトを手にした一人一人が、
ご自分の作ったものを扱うのと同じように、自由に利用することが出来ます。
A-1. フリーウェアです。作者からは使用料等を要求しません。
A-2. 有料無料や媒体の如何を問わず、自由に転載・再配布できます。
A-3. いかなる種類の 改変・他プログラムでの利用 を行っても構いません。
A-4. 変更したものや部分的に使用したものは、あなたのものになります。
公開する場合は、あなたの名前の下で行って下さい。
B. このソフトを利用することによって生じた損害等について、作者は
責任を負わないものとします。各自の責任においてご利用下さい。
C. 著作者人格権は 妹尾雄大 に帰属します。著作権は放棄します。
D. 以上の3項は、ソース・実行バイナリの双方に適用されます。
posted by 妹尾雄大 at 17:45| Comment(0) | Unity | このブログの読者になる | 更新情報をチェックする

2018年02月23日

Daz 3DのキャラクターをUnityへエクスポートする

image_0003.png

■Daz 3Dとは

3Dキャラクターモデルを作成出来る無料のソフトとして、

Daz 3D

というものがあるのですが、これで作成したモデルをエクスポートし、Unityで使用する方法をご紹介したいと思います。


■ゲームやVRで使用する場合のライセンスについて

なお、Daz 3Dを使用してキャラクター等をレンダリングした画像や動画は自由に公開して構わないのですが、ゲームやVRなどで使用する場合は、各データを購入時に追加で「Interactive Licence」というものを購入する必要があります。

daz0.png

詳しくは、

Interactive License - Daz 3D

を、ご確認下さい。また、このあたりのライセンスはたまに変更される場合がありますので、その都度ご確認することをおすすめします。


■キャラクターの準備

では、早速、エクスポートするためのキャラクターを準備します。ここでは、

Genesis 8 Starter Essentials

という無料のものを使用します。

daz1.png

Daz 3Dを起動し、上記のデータを開き、

Figures/Genesis 8 Basic Female
Hair/Toulouse Hair
Wardrobe/Basic Wear 01

を、追加していきます。


■エクスポート

メニューのFileからExportを選び、ファイルの種類を「Autodesk FBX (*.fbx)」に変更し、適当にファイル名を入力します。ここではひとまず「Female.fbx」とします。

daz2.png

そして保存ボタンを押すと「FBX Export Options」というウィンドウが表示されますので、「Morph」にチェックを入れ、「Edit Morph Export Rules」ボタンを押します。

daz3.png

ここで、「Add」ボタンを押すと、新しい行が追加されるので、「Match」列の「name」をダブルクリックし「head」と入力します。次に「Action」列の「Bake」をクリックし、「Export」に変更します。これらの設定は、UnityでBlendShapeを使ってフェイシャルアニメーションさせるのに必要です。そして「Accept」ボタンをクリックします。

最後に「FBX Export Options」ウィンドウの「Accept」をクリックするとエクスポートが始まります。終了すると「Female.fbx」ファイルと「Female.images」フォルダが作成されていると思います。


■Unityにインポート

Unityで新規プロジェクトを作成し、先ほどエクスポートした「Female.fbx」ファイルと「Female.images」フォルダを一緒にAssetsの中にドラッグ&ドロップします。

次にAssetsの中に出来たFemaleをHierarchyにドラッグ&ドロップします。

daz4.png

……なんだかおかしいです。

daz5.png

白目&強烈なまつげによって、とてもやる気が失われるのですが、ここでは我慢です。

まずは、まつげから直していきます。Assetsにマテリアルを作成します。ここでは「FixEyeLash」という名前にしておきます。

次にHerarchyの「Female/Genesis8Female/Genesis8FemaleEyelashes.Shape」を選択し、「Skinned Mesh Renderer」コンポーネントの「Materials/Element 0」の「Eyelashes」に「FixEyeLash」をドラッグ&ドロップして差し替えます。

その下に表示された「FixEyeLash」をクリックし、「Rendering Mode」を「Fade」にし、「Albedo」の左にある□にFemale.imagesフォルダにある「g8fbaseeyelashes_1006.tif」テクスチャをドラッグ&ドロップして設定し、その右側のColorをRGBA(0,0,0,255)に変更します。

daz6.png

また、同じような感じで、「FixEyeMoisture」マテリアルを作成し、EyeMoistureマテリアルに差し替え、「Rendering Mode」を「Transparent」に変更し、ColorをRGBA(255,255,255,0)にします。

次は目の方を修正するために、Herarchyの「Female/Genesis8Female/Genesis8Female.Shape」を選択し、先ほど作成した「FixEyeMoisture」マテリアルをEyeMoistureマテリアルに差し替えます。

同様に「FixCornea」マテリアルを作成し、「Cornea」に差し替え、「Rendering Mode」を「Transparent」に変更し、ColorをRGBA(255,255,255,0)にし、「Metallic」を0.05、「Smoothness」を0.8にします。

daz7.png

これでまあ何とか見られるレベルになりました。

あとは、AssetsのFemaleを選択し、Rigの「Animation Type」を「Humanoid」にしてApplyボタンを押します。


■レンダリング

「Light Probe」や「Post Processing Stack」などを設定してレンダリングしたものが、このページトップの画像とこちらになります。

image_0000.png

image_0001.png



posted by 妹尾雄大 at 21:38| Comment(2) | Unity | このブログの読者になる | 更新情報をチェックする

2017年06月20日

[Unity] Viveフロントカメラで疑似AR表示を実装する方法

arcamera2.png

HTC Viveのフロントカメラの映像を、カメラの向きと画角を考慮して配置したビルボードポリゴンに表示する方法をご紹介したいと思います。

まず、新規プロジェクトを作成し、アセットストアからSteamVR Pluginをインポートし、「Assets/SteamVR/Prefabs/[CameraRig]」をHierarchyに追加します。

また、Unity 5.6ではViveコントローラが認識しないので、「Camera (eye)」に「SteamVR_UpdatePoses」をアタッチします。

詳しくは、以下のサイトを参考にして下さい。


まず、不要なので「Main Camera」を削除します。

次に、スクリーンを表示するための「3D Object/Quad」を[CameraRig]の下に作成します。とりあえず名前を「ARScreen」に変更します。

「Mesh Collider」は不要なので削除します。

「Mesh Renderer」の「Light Probes」「Reflection Probes」「Cast Shadows」「Receive Shadows」は不要なのでオフにします。

「ARScreen」に「Assets/SteamVR/Extras/SteamVR_TestTrackedCamera.cs」を追加し、「Material」に「Assets/SteamVR/Extras/Assets/SteamVR/Extras/SteamVR_TestTrackedCamera.mat」を設定し、「Target」に自分自身の「ARScreen」を設定します。

また、「Materials」の「Element 0」にも同じマテリアルを設定します。

次に、「Assets/SteamVR/Extras/SteamVR_TestTrackedCamera.cs」を開き、コードを書き替えます。直接編集するのが嫌な場合はコピーしてから書き替えて下さい。

「SteamVR_TestTrackedCamera」クラスの最後に、以下のメソッドを追加します。
// プロジェクションのスケールを取得する
static Vector2 GetProjectionScale(SteamVR_TrackedCamera.VideoStreamTexture source)
{
    Valve.VR.CVRTrackedCamera trackedCamera = Valve.VR.OpenVR.TrackedCamera;
    if (trackedCamera == null) return Vector2.one;

    // スケール値を取得するだけなので、Near/Farの値は何でも構わない
    const float Near = 1.0f;
    const float Far = 100.0f;
    Valve.VR.HmdMatrix44_t ProjectionMatrix = new Valve.VR.HmdMatrix44_t();

    if (trackedCamera.GetCameraProjection(source.deviceIndex, source.frameType, Near, Far, ref ProjectionMatrix) !=
        Valve.VR.EVRTrackedCameraError.None)
    {
        return Vector2.one;
    }

    return new Vector2(ProjectionMatrix.m0, ProjectionMatrix.m5);
}
次に、Update()メソッドの、
target.localScale = new Vector3(1, 1.0f / aspect, 1);

// Apply the pose that this frame was recorded at.
if (source.hasTracking)
{
    var t = source.transform;
    target.localPosition = t.pos;
    target.localRotation = t.rot;
}
この部分を、

// Apply the pose that this frame was recorded at.
if (source.hasTracking)
{
    const float ProjectionZ = 1.0f;
    Vector2 ProjectionScale = GetProjectionScale(source);
    Vector2 LocalScale = new Vector2(2.0f * ProjectionZ / ProjectionScale.x, 2.0f * ProjectionZ / ProjectionScale.y);

    target.localScale = new Vector3(LocalScale.x, LocalScale.y, 1.0f);

    //
    var t = source.transform;
    target.localPosition = t.TransformPoint(new Vector3(0.0f, 0.0f, ProjectionZ));
    target.localRotation = t.rot;
}
このように書き替えてビルドします。

この段階で実行すると、視界のやや下にカメラ映像のスクリーンが表示されると思います。

ただ、この状態だと、スクリーンより向こう側にあるオブジェクトが隠れて見えなくなるので、専用のシェーダを作成します。

とりあえず、「Assets」のルートで右クリックし、Create→Shader→Unlit Shaderを選択します。とりあえず、シェーダファイルの名前を「ARBackground」に変更しておきます。

その「ARBackground.shader」を開き、1行目を、

Shader "Custom/ARBackground"
に書き替え、Tagsブロックを、
Tags { "RenderType"="Opaque" "Queue"="Background" }

このように書き替え、Passブロックの先頭に、

Pass
{
    ZWrite Off

    CGPROGRAM
このように「Zwrite Off」を追加します。

ビルドして再びUnityに戻り、「ARScreen」の「SteamVR_TestTrackedCamera」の「Shader」を「Custom/ARBackground」に変更します。

「ARScreen」のインスペクタは最終的にこのようになります。

arcamera4.png

最後に、「[CameraRig]/Camera (head)/Camera (eye)」のインスペクタを開き、「Camera」の「Clear Flags」を「Solid Color」に変更し、「Background」の色を#00000000に変更します。

arcamera3.png

これで、「ARScreen」より向こうにあるオブジェクトも手前に表示されるようになります。

なお、もし実行時に画面が白くなって何も表示されない等の不具合が発生した場合は、以下を参考にして下さい。



posted by 妹尾雄大 at 17:28| Comment(0) | Unity | このブログの読者になる | 更新情報をチェックする