2018年10月22日

プログラミング言語について

世の中には、数え切れないほどのプログラミング言語が溢れている。
初心者におすすめの言語はあれど、最終的にはどれを覚えてもいいし、だいたい3,4言語をしっかり使い込むと、以後どんな言語でもそんなに掛からずに取り組めるようになる。
(個人的にはpythonあたりから入って、余裕があればCを覚えてほしい感がある)

それは置いておいて。
プログラミング言語を選ぶとき、何を基準に選ぶだろうか?

最終的にプログラミングの結果は、過程はどうあれ機械語に翻訳されて実行される。であるならばどんな言語を使っても過程はどうあれ最終的には同じ結果を実現できるはずである。なのに世の中にはプログラミング言語が溢れている。

数ある中で何が人を引きつけ、選ばせるのだろうか?理由はいくつかある。
一つは、言語そのものの機能だ。
これがないとその系統の言語でなければ実現できない・大変に面倒くさいというものがある。例えばC言語が未だに使われる理由である、生のメモリを扱えるポインタ。これがなければハードウェア的なことできない。またクリティカルなタイミングのためにアセンブリ言語。一部他のと被るが、CGや、仮想マシン上で動作させる必要があるなどもあるだろう。

一つは文法と支援だ。
最終的には機械語になるとしても、途中過程は人間が書く。人間はミスをする。C言語で書かれたプログラムに危険なバグが多く、アセンブリは言うまでもないのはそのへんの支援が薄いからだ。人間の振る舞いに制約を書けるのも支援、適当にしてもうまく書けるようにするのも支援。PythonやRust、Javaといった言語が広まったのはこの辺の効果がある。
※なんかjavascriptはこのへんワチャワチャしてるよね。

一つは豊富なライブラリ、そしてその支援システムだ。
コードの再利用性が高く、ライブラリが揃っていれば書く量が少なくて済む。バグも少なくなる。使っているユーザーが多ければ不具合が見つかりやすく直されやすい。
なにより、初心者が適当に書いてもわりといい感じの成果物が出来上がる。
かつてPerlとCPANが流行り、今はPythonとPipや、Javascript(node)とnpmなんかが流行る理由はこの辺もある。

最後に、環境・ランタイムの利点と制約だ。
おそらくだが、最終的な一番の理由はこれなのではないかと思う。
例えばiPhoneアプリを開発するにはSwiftかObject-Cしか使えない。Androidアプリならjavaか、Kotorinかを覚えないと細かいところがさわれない。ブラウザ上で動作させるならjavascriptしか使えない(頑張ればCも使えるけど)。マルチプラットフォームに対応させようと思うとjavaが楽。Unityで使うならC#(昔はjavascriptも使えた)。FlashAir上で動作させるならLuaしかない。

どこで、なにがしたいか。そのために何が使えるか...ではなく何を使わなければならないか。逆に言えば、環境での制約がないのなら何を使ってもいい。で、制約がない状態でどれを選ぶかと言われれば、現在活発的なユーザーと資料が多いものがいい
そして、実現したいものがなるべく楽で簡単にできるものがいい

最後のが重要で、逆に実現したいものがなるべく簡単で楽にできる環境を選ぶべきである。

自分にとってCが手に馴染んでいて、C以外使いたくないなら、Cで実現できる環境を選んで使えばいいし、なるべくコードを書きたくないなら、最先端のコード不要でほとんどのことができる、ユーザーの多い環境(Unityとか)を選んで、必要最低限のコードだけ書けばいい。

あと最後に。
よく勘違いしやすいし、環境上の制約でそうならざるを得ない場合もあるのだが、忘れないでほしいのは一つの言語ですべてを賄う必要はないということ。不得意なところは別の言語に投げてもいい。(ただしその分覚えることは増えるが)

例えば、UIはHTML+javascript、機械学習はpython、演算処理はC、プラグインはLuaのように。というもの、それらもまた結局、不得意なところ(大抵は速度面)は別の言語(たいていC)の成果物に投げている事が多い。

一つの言語を使っているように錯覚しても、DLLを使えば、最終的にはCに戻ってこれる。
(javascriptとかだとあまり頼ること少ないかも知れないけれど)
Cを学習するのが無駄にならないのは、これが理由の一つだ。
posted by gpsnmeajp at 17:22| Comment(0) | TrackBack(0) | プログラム

2018年10月11日

[ポエム]VR空間にも「スマートフォン」が欲しい

VR空間にも「スマートフォン」が欲しい。
この「スマートフォン」というのは、いわゆる現実のスマホそのものではなく、概念的なものである。
どういうことか。

皆さんは、電車内で暇な時や、他人と話している最中にふと思った調べたいことが現れた時、
あるいは、他人が作業し終わるのを待っていて手持ち無沙汰な時、何を取り出すだろうか。
大体の人はスマートフォンを取り出すと思う。

では、VR空間ではどうだろうか。VRゲームの最中なんかには暇はないが、
例えばVRChatなどでのロード待ちや、ふと他の人を待つ時、オンラインゲームでのロビーなど。
あるいは会話していて知らない単語が出てきた時。

一応、スマホ的なものは使える。
例えば(私はHTC Viveを使っているので)Steamメニューのブラウザが使える。
が、これだと、言ってしまえば新聞を目一杯目の前に広げるようなもので、会話中や
周囲の様子を見ながら使うものではない。あと操作が大変。

OVRDropという手もある。これはVR空間内にデスクトップのウィンドウを浮かべることができる。
...が、常に視界に、あるいは空間内に存在する。あと操作しにくい。

あと一つは、HMDの隙間から実際のスマートフォンを見ることだ。アホらしいが一番便利。

逆に言えば、「必要な時に取り出せる」「視界のじゃまにならない」「操作しやすい」を兼ね備えるものが中々ない。

VR空間で、どんなゲームでも使えるスマートフォン的なものを実現しようとすると以下のものが必要になる。
・コンテンツ
・表示装置
・入力装置

コンテンツは一番単純で、こう言うと何だがブラウザを乗せれば良い。
近代的なブラウザエンジンを乗せれば、HTML5とJavaScriptで概ねのことはできる。

表示装置は、とりあえずSteamVRならばOpenVR Overlayを使えば、どんなゲームでも関係なく
視界の一番手前に追加表示してくれる。

問題は入力装置だ。
スマートフォンの快適な操作性をサポートしているのは直感的なタッチパネルである。

現在のVRには2つ問題がある。
1つは、入力装置としての快適性である。
現在のVR入力機器は、手の大まかな位置を取得するにとどまっており、指の位置を細かく検出するのには向いていない。
主に親指をベースに細かい操作をするスマートフォンの再現は難しい。
ただし、タッチパッドやスティックを使って多少ゲーム的 or ガラケー的に操作することは可能かもしれない。

もう一つの、そして一番の問題点は、VR入力装置はゲームと切り離せないことである。
VRコントローラ、トラッカー、(あとキーボード、マウス、ゲームコントローラー)は、VRゲームに干渉する。
これリダイレクトして、拡張ソフトウェアでのみ扱えるようにする手段は
(かなり無理やりなものを除いて)存在しない。

スマートフォンを触っていたと思ったら歩いていた、とか、椅子に座らされていたとか、
そういった体験は現実ではありえないが、VR空間だと容易に起こりうる。

正直、この入力装置を解決すれば、簡単に実現できそうだと思っている。
誰かやってくれないかなぁ...
posted by gpsnmeajp at 20:45| Comment(0) | TrackBack(0) | 雑感

2018年09月15日

OpenVROverlayNotification ver alpha 0.1

OpenVROverlayNotification ver alpha 0.1

まだまだ開発途上ですが公開します。
現在Channel1のみ対応していますが、将来的には最低4は対応する予定です。

ダウンロード
https://sabowl.sakura.ne.jp/gpsnmeajp/unity/OpenVROverlayNotification/OpenVROverlayNotification.zip

※Windowsの通知をキャッチして表示しようと努力するツールを作りました。組み合わせてどうぞ
通知チェッカー.exe
https://sabowl.sakura.ne.jp/gpsnmeajp/unity/OpenVROverlayNotification/notice.zip





以下README.txtと同じもの

本ソフトウェアの目的
 VR空間内で長時間活動する場合、HMDを被っている都合上、外界から遮断された状態になります。
 特にソーシャルVRアプリケーションを利用している場合、他のアプリケーションに切り替えるなどするのは困難です。
 既存のオーバーレイソフトウェアを使用すればその問題は解決できますが、
 それらは常に視界に表示されていたり、コントローラーを視界に向けるなどしないと情報が見えず、常に新しい情報を待ち受けることはできませんでした。

 本ソフトウェアは、既存のソフトウェアからVR空間へ、スマートフォンの通知のような「プッシュ通知」を実現するための橋渡しのためのツールです。
 例えば地震情報や、SNSのリプライ通知、メールの新着といった「常に表示している必要はないが、すぐに知りたい情報」を表示するために使用できます。

 開発者は、本ツールを用いることで、VR空間における様々な手間や情報を知ること無く、
 一般的なpngファイルへの書き込みの知識さえあればVR空間に任意の情報を表示することができます。
 この単純な仕組みにより、あらゆる言語やツールを利用することができます。

 また、既存の地震情報などのツールを利用するため、簡易的ながらコマンドライン引数を
 VR空間に表示するサンプルプログラムを同梱しており、これを用いることでプログラミング無しで利用することもできます。

同梱物
 ・OpenVROverlayNotification.exe ソフトウェア本体
 ・notice\ch1.flg フラグファイル
 ・notice\ch1.json 設定ファイル
 ・notice\ch1.png 通知画像ファイル
 ・ch1string2png.exe 連携サンプルプログラム
 ・ch1string2png.hsp 連携サンプルプログラムのソース
 ・hspcv.dll 連携サンプルプログラムの画像拡張DLL
 ・その他すべての動作に不可欠なファイル

使い方(利用)
 Steam VRが起動している状態でOpenVROverlayNotification.exeを起動します。
 現状、ログ画面以外何も出ませんが、ウィンドウが出ていれば動作しています。

試験方法
 noticeフォルダのch1string2png.exeを起動して、黒い画面がVR空間に表示されれば動作しています。
 (表示されない場合はOpenVROverlayNotification.exeを再起動してください)

 ch1string2png.exeのコマンドライン引数に文字列を指定すると、その文字列が表示されます。
 $を文字列中に含ませると、その箇所は改行になります。

使い方(開発)
 本ソフトウェアは起動中、noticeフォルダ内の変更を監視しています。
 ch1.flgの中身を1にすると、現在のch1.jsonとch1.pngを読み込んでVR空間に表示します。
 ch1.flgの中身は自動で0に変更されます

 書き込みシーケンスは以下です。
  1. 表示したい情報をnotice\ch1.pngに書き込む
  2. 書き込み完了を通知するためにnotice\ch1.flgに1を書き込む
 (3. 本ソフトウェアが書き込みを検知する)
 (4. 本ソフトウェアがnotice\ch1.jsonを読み込む)
 (5. 本ソフトウェアがnotice\ch1.pngを読み込んでVR空間に表示する)
 (6. 本ソフトウェアがnotice\ch1.flgを0に戻す)

 ch1.jsonとch1.pngは存在しない場合はエラーとなり表示に失敗します。
 ch1.jsonの中身は、現在タイムアウト時間のみ存在します。秒数で指定します。

 ch1.pngは800x300のpngファイルを推奨します。
 これ以外のサイズでは大きすぎたり小さすぎたりします。また将来正常に読み込める保証ができなくなります。

 位置の変更、アニメーションの変更、透明度の変更などは将来的に対応する予定です。
 pngファイルのアルファチャネルには対応しています。

使用しているもの
・Unity 2018.2.6f1 Personal
・Steam VR Plugin
・HSP 3.5
・hspcv

本ソフトウェアに関するライセンス表記
zlib License
Copyright (c) 2018 GPS_NMEA_JP

This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.


HSPに関するライセンス表記
Hot Soup Processor (HSP)
Copyright (C) 1997-2014, Onion Software/onitama, all rights reserved.
Made with base technology of OpenHSP.

OpenHSP
Copyright (C) 1997-2014, Onion Software/onitama.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the Onion Software nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に限り、再頒布および使用が許可されます。

・ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
・バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
・書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、Onion Softwareの名前またはコントリビューターの名前を使用してはならない。

本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。著作権者もコントリビューターも、事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか厳格責任であるか(過失その他の)不法行為であるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、本ソフトウェアの使用によって発生した(代替品または代用サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない)直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、一切責任を負わないものとします。


hspcvおよびOpenCVに関するライセンス表記

HSPCVに含まれるOpenCVライブラリ(1.0)は、BSD Licenseとなっており、
以下に列挙するライブラリ部分の著作権表示を明示する必要があります。
(組み込みや配布に関しての制限はありません。また、ソースコードの公開義務
はありません。)

-----------------------------------------------------------------------
HSPCVに含まれるOpenCVライブラリ(1.0)は、Intel Corporationの著作物です。

Open Source Computer Vision Library
Copyright (C) 2000-2006, Intel Corporation, all rights reserved.

OpenCVライブラリ(1.0)に含まれるlibjpegライブラリはIJGの著作物です。
Copyright (C) 1991-1998, Thomas G. Lane.
this software is based in part on the work of the Independent JPEG Group

OpenCVライブラリ(1.0)に含まれるlibpngライブラリは以下の著作物です。

libpng version 1.2.8 - December 3, 2004
Copyright (c) 1998-2004 Glenn Randers-Pehrson
(Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
(Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)

OpenCVライブラリ(1.0)に含まれるzlibライブラリは以下の著作物です。

Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler

OpenCVライブラリ(1.0)に含まれるJasPerライブラリは以下の著作物です。

JasPer Version 2.0

Copyright (c) 1999-2000 Image Power, Inc.
Copyright (c) 1999-2000 The University of British Columbia
Copyright (c) 2001-2003 Michael David Adams

同梱されている以下のxmlファイルは、Rainer Lienhart氏が製作したものです。
haarcascade_frontalface_default.xml
haarcascade_frontalface_alt.xml
haarcascade_frontalface_alt2.xml

HSPCV.DLL
Copyright (C) 2007, Onion Software, all rights reserved.
This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are disclaimed.
-----------------------------------------------------------------------

(ライセンス表記は、配布物の中に上記の内容を含むテキストを含めるようにしてください。)

以上の項目を満たしていれば、ユーザーがHSPCV.DLLを使って作成したオリジナルの
ソフトウェア(実行ファイル)を、自由に通信、即売会、店頭などで展示、配布、販売
することができます。ライセンス料は必要ありません。

HSPCV.DLLの著作権はonion softwareにあります。
onion softwareは本プログラムによって生じた、いかなる損害についても保証いたしません。
自己の責任の範囲で使用してください。
また、付属のサンプルスクリプトも自由に改変、公開していただいて構いません。

HSPCV.DLLは、基本的にBSDライセンスのもと有償・無償を問わず
添付、複製、改編、再配布することができます。
ただし、その際には必ずライセンス表記も含めるようにしてください。

posted by gpsnmeajp at 23:11| Comment(0) | TrackBack(0) | プログラム

2018年09月09日

VRツール一覧まとめwiki(VR Tool Wiki)の立ち上げとVRについての所感

先日、VRツール一覧まとめwiki(VR Tool Wiki)を立ち上げました。
withurl.png
http://pc-vr.game-info.wiki/

立ち上げた主な理由は、VR関係の情報が分散していて探しにくいと感じたことからです。

VRChatにハマり、30万円掛けてVR機材を購入して遊んでいますが、VRChatに四六時中居たいかと言われるとそうではありません。ではVRChatをプレイしないときには30万円のVR機材を遊ばせておくのかと言われれば、それはあまりにももったいないでしょう。

私はVRのゲームには興味がなく(部屋が狭いのでプレイしにくいので)VRChat以外にはBeat Saberくらいしかやりません。しかしVRの環境そのものには大きな興味があります。

そもそもVRChat自体が、ゲームと言うよりは(あえて悪い言い方をすれば)MMORPGに音声チャットをつけ、キャラクターを3Dにして身振り手振りを連動させることができるようになったソフトのようなもので、ゲーム性はあまりありません。(ワールドによってはゲームのようなものを作っている人は居ますが)

ソーシャルVRと呼ばれる分野はどれもそうで、基本会話と身振り手振り、ゲームはあっても強い目的を持ったゲームではなく、わちゃわちゃできるミニゲーム的なものです。ゲームは主体ではなく人間同士のふれあいが主目的なのです。

「VRといえばゲーム・映像」「一時的に楽しむもので、終わったら外すもの」これはスマホVRなど顕著で、PCのVRでも概ねその扱いを受けます。しかし、ソーシャルVRは「VRをある種の生活空間として扱う」ため、一度入るとVR機器はつけっぱなしになります。私はVRはこの方向に将来性があると感じています。そうすると、必然的にVRゲームでは気にならなかった不便な点が見えてきます。

例えば、VR空間内で時間を把握するのが難しいこと、スマホの通知やPCの通知から切り離されること、現実では普通に使うブラウザが使いにくいこと。

VRアプリケーションを、いつでも中断できる一時的な場として考えているなら、それ用のアプリケーションに(スマホアプリのように)切り替えれば済むことですが、ソーシャルな交流の最中にそれはできません。
同じことを思う人はたくさんいるはずで、そのためのツールも存在します。が、それを見つけるのがえらく大変。VRに関しては何を探してもVRゲームばかりが全面に出てきてしまう。スマホVRも流行しており、PCのVRを探そうとするとまた邪魔になってしまう。

VR空間でモデリングするツールも、オーバーレイツールも、ソーシャルVRも、どこにもまとまっていない。あるとすればSteamですがあそこも探しやすいとは言えない。

そこで、いっそ必要そうな情報を全部まとめる場がほしい、と考えてwikiを立ち上げました。

ソーシャルVR、VRソフトウェア、VR創作ツール、VR補助ツール、VRアニメ、VRゲーム(PC)、VRM対応ソフトウェア、VRM対応販売アバター、と細かく分けているのは、様々な情報を探しやすくするためです。
現在日本のVR界隈はtwitterに情報が散乱しすぎています。

せっかく便利なツールやアプリケーションを作っても、見つけられることがなければ、探されることがなければ使われません。ゲームならば面白ければ広がりますが、ツールやアプリケーションはそうではありません。

そこで「ここを見れば便利なツールがいっぱい乗ってるよ」といわれるような場を目指しています。

VRChatが全盛の日本環境では、需要はあまり高くないかも知れません。しかしVRChatの情報も正直分散している上に、信頼性の高くない情報も混じっています。そこで、ある意味では客集めに、ある意味では自分がほしいから、VRChatの情報もまとめることにしました。

既存のwikiにある情報を取り込んでも仕方ないので、既存のwikiにない情報をカバーし、他サイトにある情報はリンクで繋いでいます。

以上、ご利用いただけると幸いです。
posted by gpsnmeajp at 15:16| Comment(0) | TrackBack(0) | 雑感

2018年07月29日

VRChatパスワード入力式インスタンス移動システム(VRC Password Jumper)

*はじめに
この記事は、以下の記事を前提としています。

VRChat固定インスタンス間移動システム(VRC World Jumper)の設置方法 http://gpsnmeajp.sblo.jp/article/184041906.html

*概要
パスワード認証を実装してみました。

お試し用ワールド
https://vrchat.net/launch?worldId=wrld_30da4670-55de-4633-a2e3-b6d34ab1b5b1

jmpD.png



twitterに載せたところ割と評判が良かったので、差し替え用HTMLを配布します。
(このままページを開くとデモを試すことができます。パスワード=1234)
https://sabowl.sakura.ne.jp/gpsnmeajp/tool/vrcpass.htm

Quadの大きさや、WebPanelの描画の大きさは適時調整してください。
Scale X=1,Y=1と、W=800,H=800で動作確認しています。

*解説
WebPanel上で動作するjavascriptでパスワード認証を行い、照合に成功すると特定のインスタンスにジャンプします。
このインスタンスは、Ownerの居ないInviteOnlyになるため、誰もInviteできません。
つまり、正しいパスワードを入れた人しか入れません。

謎解きワールドなどに使えるかもしれません。
桁数の制限はありません。
他者の入力しているパスワードを見ることはできません。

ところで、パスワードによって飛ぶ先を変えたり、パスワード入れたらQRコード表示されたり、いろいろできます。やってみたいことありましたらコメント等にdiscordかtwitterのIDを添えてでお問い合わせください。

*注意
1. パスワード認証はかなり簡易的なものです。おもちゃとして取り扱ってください。
注意喚起のためあえて突破方法を案内します。
以下の方法で突破することができます。
・ワールド情報のぶっこ抜き→HTML内の閲覧
・ワールドIDを何らかの方法で引っこ抜いてからの直接GotoRoom
・総当たり攻撃
これらに対する対策は可能ですが、外部サーバーが必要になります。

2. この方法はVRChat公式の方法からは外れた方法です。
公式から提供されている機能を利用していますが、未保証な機能です。(理由はページ末へ)
将来的に使用できなくなる可能性があります。

3. この手法を用いたことによる損害等の責任は一切持ちません。

4. WebPanelが何らかの理由で動作不良になっている人は飛べません

5. 一度ワールドから蹴り出されると、戻るためには再びパスワードを入れるしかありません。

*苦労した点
まさかPC上でチャタリング対策を実装するとは思わなかったよね

*応用例
こんなふうに使えるかもしれません。
1. ワールドを作る。
2. ワールドに、このパスワードシステムを設置する。
 そして、このワールドのURLをSNSとか個人サイトに適当に貼る。
 (https://vrchat.net/launch?worldId=wrld_48cf80e6-15dd-4c17-8667-c5dc01baa5cb のように)
3. パスワード知ってる人は、公開されたワールドを経由して、
 「パスワード知ってる人用インスタンス」にいつでも入ることができる。
posted by gpsnmeajp at 20:01| Comment(0) | TrackBack(0) | 雑感

【未検証】人数増えると重くなるVRChatのワールドをお手軽に軽くできそうな方法(カメラのカリング距離)

※根本的に複数インスタンス間を移動できるようにしてしまうという手もあります。こちらもどうぞ。
VRChat固定インスタンス間移動システム(VRC World Jumper)の設置方法
http://gpsnmeajp.sblo.jp/article/184041906.html

*はじめに
VRChatって、人数集まるとかなり重くなりますよね。
それって多分、遠くにプレーヤーが居ても消えないからんじゃないかな、と勝手に思っていました。

たまたまVRChat技術メモ帳を見に行ったら気になる項目が更新されていました。
https://vrcworld.wiki.fc2.com/wiki/VRC_SceneDescriptor

「カリングの範囲はこのカメラの設定が適用される。Nearを最小にすれば、普段より近づいてもカリングされなくなる。
https://twitter.com/gatosyocora/status/1023400101933248512
カリング(余計なものを描画しない処理)の距離が変更できるらしいです。

Near、つまり近づきすぎたときに消える処理をいじると、ガチ恋距離ができるという。
では、Farはどうなってるのかなと思ったら「1000m」でした。そりゃ離れても消えませんわ。
(天空高くや、地下深くなど、別の部屋を遠くに作ると軽くなると言われる原因はこれかと思います。)
なお、声は350m離れると聞こえなくなります。

というわけで、カメラのカリング距離を変更して、遠くにいるプレーヤーが見えないようになれば、人数増えてもあまり重くならないんじゃないかなと思いました。
代償として、遠くの壁や物品も見えなくなりますが...

また、同期周期もデフォでは最小値の33msを大きく下回る10msになっているらしいので、これも大きくすると重さが改善されそうです。
※最新のSDK(VRCSDK-2018.06.21.13.02_Public.unitypackage)ではこの問題は修正されており、デフォルトで33msに設定されています。
https://docs.vrchat.com/docs/vrchat-201822

*設定方法
クリックで拡大
light0.png

*カリング距離の適用結果
light1.png
posted by gpsnmeajp at 14:34| Comment(0) | TrackBack(0) | 雑感

VRChat固定インスタンス間移動システム(VRC World Jumper)の設置方法

VRC World Jumper


jmpA.png

この記事を試す前に、下記の対策も試してみてください。(併せると効果高くなります)

ワールドのカメラのカリング距離調整と、同期頻度調整
http://gpsnmeajp.sblo.jp/article/184044375.html

*概要
VRChatはまだ未発展のサービスということもあり、1つのワールドに20人以上集まると段々と重くなってきます。
しかし、ワールドの部屋単位たるインスタンスは、基本個人に紐付いて生成されるため、
publicではないインスタンスでは、フレンド同士でないと移動が難しくなります。

ワールドに設置したポータルは、インスタンスを指定できないため、
時に違うインスタンスに移動してしまったりします。

ここでは、WebpanelのGoToRoomを使った「固定のインスタンス間の移動」を
行う仕組みをワールドに実装する方法をご説明します。

お試し用ワールド
https://vrchat.net/launch?worldId=wrld_30da4670-55de-4633-a2e3-b6d34ab1b5b1

*注意
この方法はVRChat公式の方法からは外れた方法です。
公式から提供されている機能を利用していますが、未保証な機能です。(理由はページ末へ)
将来的に使用できなくなる可能性があります。

この手法を用いたことによる損害等の責任は一切持ちません。
vrcjmp.zip内のコードに関してはCC0とします。

*よりシンプルな作例のご紹介
がとーしょこら(@gatosyocora)様がunitypackageでよりシンプルな形態のものを配布されています。
こちらもご検討ください。
https://twitter.com/gatosyocora/status/1022125633671843840

*作り方
1. 以下のファイルをダウンロードし、展開します。
https://sabowl.sakura.ne.jp/gpsnmeajp/tool/vrcjmp.zip
v1.0 2018-07-29 公開
v1.1 2018-07-29 構造の改良と色付け
v1.2 2018-07-29 nonceの修正

2. vrcjmp.htmの中身を書き換えます。
「wrld_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx」を、自分のワールドのIDに置き換えてください。
別の部分を巻き添えで消さないように注意してください。1文字でも欠けると動きません。
jmp1.png
ワールドのIDは、Unityの「VRChat SDK」の「Manage Uploaded Content」からコピーできます。
(まだ一度もpublishしていないワールドはコピーできません。一度publishしてください)
jmp2.png

3. webフォルダを作り、その中にvrcjmp.htmを配置します。
jmp3_1.png

jmp3_2.png

jmp3_3.png

4. ワールドにWebpanelを設置します。
まずそのためのQuadを設置します。位置は自由です。
Scale はX : Y が 2 : 1 になるように設定してください
(例ではX=1, Y=0.5にしています)
jmp4.png

jmp5.png

QuadにVRC_Web Panelをセットします。
jmp6.png

設定はまず以下のようにします。特に赤枠に注意してください。
(赤枠以外も変更していますので、なるべく同じ状態にしてください)
jmp7.png

次に、vrcjmp.htmを読み込むように設定します。
jmp8.png

最終的に以下のようになればOKです。
jmp9.png

*ワールド内での使い方
ワールドに入ると以下のように表示されます。クリックすると、指定されたFriend+のインスタンスに飛びます。
これは固定化されており、誰がクリックしても同じROOMは同じインスタンスに飛びます。
(なお、このルームの数や種類はvrcjmp.htmを編集することで変更できます。)
jmpA.png
最初にワールドを開いた人は、そこは固定されたインスタンスではないため、
まずどれかのROOMをクリックして移動しておくことをおすすめします。

*ちなみに
HTMLをカスタマイズするとこういう画像を使ったものや、ボタンを増やしたものもできます。また、違うワールド同士を固定のインスタンスで接続したりもできます。

パスワード入力して正しいときだけ特定のワールドに飛んだり、オリジナルのポータルを通ってワールド間を往来したり、時刻によって飛び先が変わったり、そんなことも多分できます。

やってみたいけどやり方わからない、という方は、簡単なものであればお作りできますので、お気軽にページ下部のコメントでお問い合わせください。
問い合わせの際にはdiscordかtwitterのIDを添えてください。

例えば、城ワールドと飛空艇ワールドと迷宮ワールドを行き来できるようになったり
jmpB.png
パスワード認証したり(http://gpsnmeajp.sblo.jp/article/184045837.html )
jmpD.png

なお、設置の仕方がわからないという問い合わせは受け付けかねます。

設置してみたけどうまく動作しない場合は、上記の手順をしっかり読み直して、
可能であればまっさらなワールドに設置してみて、それでもダメ場合は
配布HTMLの不具合等の可能性がありますので、お問い合わせください。

*メモ
・セキュリティを向上させたい場合はnonceを書き換えてください。
・他のワールドのWorldIDを指定すると、他のワールドの固定インスタンスに飛ぶことができます。
 (相互に設置し合うと、行って帰ってくることができるようになります)
・スクリプトや外部サーバーを組み合わせるとかなりいろいろなことができます。
・負荷の都合上おすすめしませんが... その場にいる全員を違うワールドにふっとばすこともできなくはないようです。
・VRC_Triggerから発動もできるはずなので、斬られると天国に飛ばされるとかも、できなくはない
 →Triggerからの発動についてはがとーしょこらさんの仕組みのほうが単純で良いと思われる。

*書式
ユーザーIDあり
Public
wrld_xxxx:0000~public(usr_yyyy)
Friends+
wrld_xxxx:0000~hidden(usr_yyyy)~nonce(zzzz)
Friends
wrld_xxxx:0000~friends(usr_yyyy)~nonce(zzzz)
Invite+
wrld_xxxx:0000~private(usr_yyyy)~canRequestInvite()~nonce(zzzz)
Invite Only
wrld_xxxx:0000~private(usr_yyyy)~nonce(zzzz)
wrld_xxxx:0000~private(inviteurl_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)というパターンも?

ユーザーIDなし
Public
wrld_xxxx:0000~public
Friends+
wrld_xxxx:0000~hidden~nonce(zzzz)
Friends(実質Closed?)
wrld_xxxx:0000~friends~nonce(zzzz)
Invite+
wrld_xxxx:0000~private~canRequestInvite()~nonce(zzzz)
Invite Only(実質Closed?)
wrld_xxxx:0000~private~nonce(zzzz)

VRChat ワールド一覧 - beta のURL生成機能を参考にさせていただきました。
http://teruaki-tsubokura.com/vrchat/

なおこのインスタンスに関する法則性は起動時のワールド指定でも有効です。
(ワールドIDのみだとInvite Onlyで起動しますが、Publicに飛んだりできる)
Launch URL - Programming in VRChat
http://vrcprog.hatenablog.jp/entry/tips-Launch_URL

*「公式から提供されている機能を利用していますが、未保証な機能です」について
この機能は、VRChatのWebPanelに搭載されているJavascript API bindingsのGotoRoom機能を利用しています。この機能含め、Javascript API bindingsはマニュアルには乗っておらず、実際殆どが機能しません。GotoRoom機能は数少ない動作している機能の一つです。

UnityでVRC_Web Panelを設置して、ローカルのファイルを指定すると以下のような表示が現れます。

jmpC.png

以下意訳
「Javascript API bindingsを呼び出すには、engine.call('メソッド名',...)を使ってね。これはPromiseライクなオブジェクトを返すよ」
「ListBindings()を呼び出すと、利用可能なAPIを確認することができるよ」
「ページが読み込み完了してAPIが使えるようになったらonBindingsReadyイベントが発生するからlistenしてね」
(注: GotoRoomは単純な機能なのでonBindingsReadyイベントをチェックする必要はほぼ無いです)

というわけで、どうやらワールド製作者が利用することを最初から意図しているようです。
が、未完成なのでマニュアルに乗ってないものと推測されます。
posted by gpsnmeajp at 04:04| Comment(0) | TrackBack(0) | トラブル解決

2018年07月11日

VRChat向け小ネタシェーダー(FPS表示・テクスチャ切り替え)

VRChatやってると、ちょっと変なシェーダーが欲しくなることありますよね。
スクリプト使えないのでAnimatorでなんとかしなきゃいけなかったりして。

ちなみにすべてUnlitです。

FPS表示


現在のFPS(フレーム/秒)を表示します。
ちなみにシェーダーが動作している人のfpsが表示されるので、アバターに仕込むと見る人によって数値が違います。
showfps.png

ダウンロード↓
https://sabowl.sakura.ne.jp/gpsnmeajp/blog/FPSMonitorShader.unitypackage

・使い方
1.読み込みます。
fps1.png
2. Shaderフォルダができます
fps2.png
3.Materialを適当なオブジェクトに突っ込みます
fps3.png
fps4.png
4. fpsが表示できました
showfps.png
5.ちなみに、alpha値を設定すると半透明になります。

テクスチャ切り替え


モデルのテクスチャを切り替えます。
・2つをきっちり切り替えるやつ
(0か1かしかない)
switch2.png

・2つをスムーズに切り替えるやつ
(例えば0.5で2つのテクスチャが均等に混ざる)
switch2smooth.png

・8つをきっちり切り替えるやつ
switch8.png
の3種類あります。

ダウンロード↓
https://sabowl.sakura.ne.jp/gpsnmeajp/blog/TextureSwitcherShader.unitypackage

・使い方
1.読み込みます。
tex1.png
2. TexSwフォルダができます
tex2.png
tex3.png
3. 試しにこんなふうに設定してみると
tex4.png
0にするとこう
tex5.png
1にするとこうなります。
tex6.png
4.Animationでは、_Switch変数を操作すると同じことができます。
tex7.png
値を直でセットしてください。
tex8.png

シェーダーを始めるにあたって参考にした文献
https://docs.unity3d.com/jp/460/Manual/SL-BuiltinValues.html
https://qiita.com/sune2/items/fa5d50d9ea9bd48761b2
http://izmiz.hateblo.jp/entry/2014/02/23/223405
http://baba-s.hatenablog.com/entry/2018/01/09/090000
http://marupeke296.com/UNI_S_No2_ShaderLab.html
http://marupeke296.com/UNI_S_No3_SurfaceShader.html
http://www.suitechlog.net/entry/2017/12/11/190937
http://light11.hatenadiary.com/entry/2018/05/06/230414
https://qiita.com/moca_uni/items/4e71e423c84f830687f1
http://www.jonki.net/entry/20140209/1391944797
https://qiita.com/edo_m18/items/591925d7fc960d843afa
https://docs.unity3d.com/ja/current/Manual/SL-BuiltinFunctions.html
https://answers.unity.com/questions/192553/camera-forward-vector-in-shader.html
https://www.slideshare.net/kurisaka_konabe/20121208-unityhack-billboard
http://wordpress.notargs.com/blog/blog/2015/11/10/unity%E5%BA%8A%E5%B1%8B%E3%81%AE%E3%81%82%E3%82%8C%EF%BC%88%E3%82%B5%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%AB%EF%BC%89%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%80%E3%83%BC%E3%82%92%E4%BD%9C%E3%81%A3/
https://qiita.com/edo_m18/items/d6a5a39e9b42da723663
http://ch.nicovideo.jp/tenoji/blomaga/ar1527951
posted by gpsnmeajp at 21:10| Comment(0) | TrackBack(0) | プログラム

2018年07月01日

#VRChat のログをHMDでも見たい時用PowerShellスクリプト

ワールドのデバッグ等々の際ログを見たくなりますが、HMDをかぶっているとうまく表示されないものです。
そこでWindows Power Shellを使って、VRChatのログを表示しましょう。
vvvlog.png

*注意
※製作者はWindows Power Shellは初心者です。
 これを実行したことによる損害等の保障は一切しません。
 スクリプトをざっと読んで何をするのか理解した上で実行してください。


*仕組み
VRChatのデバッグログファイル(%appdata%\..\LocalLow\VRChat\vrchat;output_log.txt)を
リアルタイムに読んでいるだけです。ので、チートとかには該当しないと思います。

VRChatのメニューキー+3とほぼ同じ情報が出ていると思います。

VRChatを長時間立ち上げ続けていると、ファイルが分割されて表示できなくなることがあります。
その際はVRChatを起動し直すか、コマンドのファイル名を修正してください。

*最も基本的な手順
1. Windows Power Shellを起動する(スタートメニューにあるはず)

2. 以下のコマンドを入力してEnter(長いが1行。コピペでどうぞ)

cat "$env:APPDATA\..\LocalLow\VRChat\vrchat;output_log.txt" -wait -Encoding UTF8 | ? {$_.trim() -ne "" } | % {$_ -replace "</?color.*?>",""}


コードの内容
・VRChatのログファイルの最新情報をUTF-8で常に読み込みながら
・空行を削除しながら
・Unity用のcolorタグを削除しながら
・画面に表示する

3. 出てきた画面をOVRDropなどを利用してVR空間に表示する

フォントサイズを大きくすると見やすくなります。
設定はPowerShellのタイトルバーを右クリックして出てきた設定から。

ログを止めたいときはScroll Lock
終了したいときはCtrl+Cか、PowerShellを閉じる。

*特定の文字を含むログを出したい場合
例えばIKを含むものの場合

cat "$env:APPDATA\..\LocalLow\VRChat\vrchat;output_log.txt" -wait -Encoding UTF8 | ? {$_.trim() -like "*IK*" } | % {$_ -replace "</?color.*?>",""}


例えばExecuting event(ワールドでのトリガなどの始動)を含むものの場合

cat "$env:APPDATA\..\LocalLow\VRChat\vrchat;output_log.txt" -wait -Encoding UTF8 | ? {$_.trim() -like "*Executing event*" } | % {$_ -replace "</?color.*?>",""}


例えばSwitching (プレーヤー名) to avatarを含むものの場合

cat "$env:APPDATA\..\LocalLow\VRChat\vrchat;output_log.txt" -wait -Encoding UTF8 | ? {$_.trim() -like "*Switching * to avatar*" } | % {$_ -replace "</?color.*?>",""}


*色をつける・音を鳴らす
長くて改行も含んでますが、コピペで入力してください
いろいろとワールド制作に便利そうなのを強調したりしてみています

cat "$env:APPDATA\..\LocalLow\VRChat\vrchat;output_log.txt" -wait -Encoding -last 5 UTF8 | ? {$_.trim() -ne "" } | % {$_ -replace "</?color.*?>",""} | % {
$msg = $_ -replace "</?color.*?>",""
if($_ -match "uSpeak"){
#uSpeakを含むとき表示しない
}elseif($_ -match "APIUser"){
#APIUserを含むとき表示しない
}elseif($_ -match "The referenced script on this Behaviour"){
#The referenced script on this Behaviourを含むとき表示しない
}elseif($_ -match "Can not play a disabled audio source"){
#Can not play a disabled audio sourceを含むとき表示しない
}elseif($_ -match "IK\[VRCPlayer"){
#IK[VRCPlayerを強調
Write-Host $msg -backgroundcolor DarkRed
}elseif($_ -match "Photon"){
#Photonを強調
Write-Host $msg -backgroundcolor DarkRed
}elseif($_ -match "OnPlayerJoined"){
#OnPlayerJoinedを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(800, 100)
[Console]::Beep(4070, 100)
}elseif($_ -match "I am MASTER"){
#I am MASTERを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(2000, 100)
}elseif($_ -match "Room"){
#Roomを強調
Write-Host $msg -backgroundcolor DarkCyan
}elseif($_ -match "OnPlayerLeft"){
#OnPlayerLeftを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(300, 100)
[Console]::Beep(150, 100)
}elseif($_ -match "triggered"){
#triggeredを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(500, 10)
}elseif($_ -match "OnOwnershipTransfered"){
#OnOwnershipTransferedを強調
Write-Host $msg -backgroundcolor Black
[Console]::Beep(400, 10)
}elseif($_ -match "Executing event"){
#Executing eventを強調
Write-Host $msg -backgroundcolor DarkGreen
[Console]::Beep(700, 10)
}elseif($_ -match "Preparation has taken"){
#Preparation has takenを強調
Write-Host $msg -backgroundcolor DarkGreen
[Console]::Beep(700, 10)
}elseif($_ -match "to avatar"){
#Switching * to avatarを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(300, 10)
}elseif($_ -match "Warning"){
#Warningのとき
Write-Host $msg -foregroundcolor red
}elseif($_ -match "Exception"){
#Exceptionのとき
Write-Host $msg -foregroundcolor yellow
}elseif($_ -match "Error"){
#Errorのとき
Write-Host $msg -foregroundcolor Cyan
}else{
#Logのとき
Write-Output $msg
}
}


*入退室情報だけ表示する
長くて改行も含んでますが、コピペで入力してください

cat "$env:APPDATA\..\LocalLow\VRChat\vrchat;output_log.txt" -wait -Encoding -last 5 UTF8 | ? {$_.trim() -ne "" } | % {$_ -replace "</?color.*?>",""} | % {
$msg = $_ -replace "</?color.*?>",""
if($_ -match "OnPlayerJoined"){
#OnPlayerJoinedを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(800, 100)
[Console]::Beep(4070, 100)
}elseif($_ -match "OnPlayerLeft"){
#OnPlayerLeftを強調
Write-Host $msg -backgroundcolor DarkCyan
[Console]::Beep(300, 100)
[Console]::Beep(150, 100)
}else{
#その他は表示しない
}
}

posted by gpsnmeajp at 04:22| Comment(0) | TrackBack(0) | プログラム

2018年06月09日

VRChatワールド用の簡単なギミック集

VRChatワールド用の簡単なギミックを画像で解説します。
基本的に画像のとおりに作ればできるはずです。

画像はクリックすると拡大できます

・アバター台以外でアバターを変更するオブジェクトを作る
VT (5).PNG

・持ち上げたり落としたりすると音のなるオブジェクト
VT (6).PNG

・持ち運んで接触させると消滅する扉と鍵
VT (7).PNG

・音楽を持ち歩こう(持ち歩くと音楽が流れて、置くと音楽が止まるオブジェクト)
VT (1).PNG

posted by gpsnmeajp at 18:05| Comment(0) | TrackBack(0) | 雑感

2018年06月07日

VRChatのワールドに音楽などAudioSourceを追加すると不協和音・ふにゃふにゃする場合の対処(ドップラー効果をオフにする)

VRChatのワールドに音楽などAudioSourceを追加すると不協和音・ふにゃふにゃする場合の対処。
といっても、Unityのドップラー効果をオフにするだけです。

Unityを普段から触ってる人だとすぐわかるんだろうな...
AutdioFix.png
クリックしてフルサイズで閲覧
posted by gpsnmeajp at 21:03| Comment(0) | TrackBack(0) | 雑感

2018年06月03日

VRChatが重い場合の対処法(画質を下げる)

VRChatが重くて仕方ない場合の対処法について

VRChatは重くなると、画面がガクガクしてくる以上に、会話がままならなくなることがあります。
(特にVRにおいては、SteamVRのローディング画面が頻繁に現れ始める)

・VRChat内での対処
1. 軽いワールドに行く
2. 他の人に軽いアバターにしてもらう
3. 一定人数以上の場所に行くのを諦める

・デスクトップの場合
1. 画面を小さくして、解像度を下げる
2. Shiftキーを押しながら起動して、解像度を下げつつフルスクリーンにする
3. ビデオカードのドライバ設定から、軽い設定を強制するようにしてみる

・VRの場合
1. Shiftキーを押しながら起動して、VR Lowを選択してみる
2. HTC Viveの設定から「Application Resolution Adjustment」を下げてみる。
 (HMDに映る映像の解像度が非常に下がります)
B1.png

これでだめなとき、不満なときはPCを買い替えましょう。

VRChatは、
・ユーザーの作った最適化されていないアバター
・ユーザーの作った最適化されていないワールド
・開発途中のソフトウェア
のくみあわせのため、通常のVRゲーム等に比べてかなり重い作品です。
人数とアバター、ワールドの組み合わせによって快適不快が全く変わります。

人数の少ないワールドならGTX970Mでも快適に動きますし、
人数の多いワールドならGTX1070Tiでも重さを感じます。(1070Tiでは会話不能になったことはありません)
posted by gpsnmeajp at 23:36| Comment(0) | TrackBack(0) | 雑感

VRChatのワールドにゴミ箱と一斉消去装置をつける

概要


VRChatのワールドに、無限にObjectをSpawnさせられる物を置くと、
だいたい人が集まったときに大変なことになります。

ので、ゴミ箱がほしい、と思ってもなかなかうまく行かない。
思い込みもあって大変だったので、スクショ載せつつ軽く説明をメモ代わりに置きます。

参考にしたサイト


↓私はこのページからワールド作成に入りました。
【VRChat】オリジナルワールドを作る【Unity】 - トマシープが学ぶ
http://bibinbaleo.hatenablog.com/entry/2017/11/24/183801

ワールド作成入門 - VRChat 技術メモ帳
https://vrcworld.wiki.fc2.com/wiki/%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E4%BD%9C%E6%88%90%E5%85%A5%E9%96%80

↓込み入った機能をつけるときはログ大事。他の人のワールドの仕組みを推測するのにも使える。
デバッグに使える技術 - VRChat 技術メモ帳
https://vrcworld.wiki.fc2.com/wiki/%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93

↓今回やることはほぼほぼこれ
DestroyObject - VRChat 技術メモ帳
https://vrcworld.wiki.fc2.com/wiki/DestroyObject

参考にさせていただいたワールド
kemomimi town

要点だけ


・消されたい方の量産されるObjectの設定
ワールド内にある各「消えてほしいオブジェクト」のPrefab
fab2.png

DestroyObjectを、誰に、どのタイミングで発動させるか、が大切。
(そもそも持ち上げたり同期させたりするためにVRC_PickupとかVRC_Object Syncが必要なのはわかってると思うので説明しない)
クリックしてフルサイズで閲覧
A1.png

・ゴミ箱Objectの設定(消したいものをぶつけると消えるやつ)
「ゴミ箱にしたいObject」(例ではCube)
abc.png

今回はついでに、一斉消去装置起動ボタンとしている
クリックしてフルサイズで閲覧
A2.png

・一斉消去装置
「巨大なCube」のPrefab
fab1.png

いうなれば巨大ゴミ箱である。
その巨大さを持って、対象のOnEnterTriggerを一斉に発火させる。
消去し終わった頃合いを見計らって自分自身も消える。
これが存在している限り、生成される片っ端から対象Objectが消滅する
クリックしてフルサイズで閲覧
A3_1.png

以上
posted by gpsnmeajp at 16:43| Comment(0) | TrackBack(0) | 雑感

2018年05月14日

VRChat配布アバター 72Polygons配布ページ

vr0.png

某ブロック積み上げゲーム用に作ったスキンデータをVRChatでも使いたくて、
拙いですが、それ風の3Dモデルを一から作りました。

あくまでスキンデータを貼り付けるだけの3Dモデルなので、72ポリゴンしか使わない超軽量な3Dモデルになりました。
割と評判が良かったので、簡単に使えるよう各種設定済みのUnityPackageとして配布します。

自作のスキンデータをお持ちの方は、拡大して差し替えるだけで使えるようになります。
オリジナルのモデルでVRChatに参加する楽しさを味わってください。
※かなり古い時代のスキンデータをベースとしています。アクセサリなどは反映されないのでご注意ください。(β時代やSteve仕様)

注意: 自作ではないスキンデータの使用はおすすめしません。フリー配布のものでもVRChatで利用することは想定されていない場合があります。利用規約を確認したり、製作者に問い合わせるなどして権利的に問題ない状態にしてから利用してください。

当方ではこのモデルのテクスチャを張り替えたことによる権利侵害などに対する責任は一切負いません。


本モデルおよびUnityPackageのライセンスについて


1. https://sabowl.sakura.ne.jp/gpsnmeajp/72Polygons.unitypackage
2.base-scale.png
3.base.png

上記3つのデータは、そのあまりの単純さに基づき、CC0において利用を許諾します。

CC0


CC0についての引用を以下に示します。
原文: https://creativecommons.org/publicdomain/zero/1.0/legalcode.ja
世界の大部分の法域の法律は、新規の著作物および(または)データベース(以下、それぞれを「作品」という。)の創作者およびその承継人(以下、あわせて「権利者」という。)に対して、独占的な著作権および関連する権利(定義は後述する。)を自動的に与えている。

権利者の中には、創作的、文化的、科学的作品の共有地(以下「コモンズ」という。)に貢献する目的で、作品についての自己の権利を恒久的に放棄することを望む者がいる。コモンズでは、一般の人々が、確実に、かつ後発的な侵害の主張をおそれることなく、そのような作品をベースに使い、改変し、他の作品に取り込み、再利用し、再配布することができる。これらの行為は、どのような態様によっても、商業目的を含むどのような目的でも、可能な限り自由に行うことができる。

このような権利者は、フリー・カルチャーの理念を普及させ、創造的、文化的、科学的作品のさらなる創造を促すことでコモンズへ貢献することができる。あるいはまた、他人による利用や他人の活動を通じて、自己の作品の評価の獲得や、自己の作品のさらなる流通を実現するために、コモンズへ貢献することができる。

上記ならびに(または)その他の目的および動機のために、作品にCC0を付する者(以下「確約者」という。)は、追加の対価または補償を一切求めることなく、確約者が本作品の著作権および関連する権利の権利者である限り、すすんで本作品にCC0を適用し、CC0の規程に従って、自らの作品を公に配布する。この行為は、確約者が、本作品について確約者が所有している著作権および関連する権利、CC0の意味、およびCC0がこれらの権利に及ぼす法的効果を理解したうえで行われる。

1.著作権および関連する権利 CC0の下で利用可能とされる作品は、著作権、および関連しまたは隣接する権利(本規程において「著作権および関連する権利」という。)によって保護されている場合がある。著作権および関連する権利には以下に掲げるものを含むが、これに限られない。

作品を複製し、改変・翻案し、配布し、上演・演奏し、展示し、提供し、および翻訳する権利
著作者および(または)実演家が保有する人格的権利
作品中に表現される人物の画像または肖像に関するパブリシティ権およびプライバシー権
作品に関連して行われる不正競争を防止する権利(ただし、4(a)に基づく制限の対象となる)
作品に含まれるデータを抽出し、拡布し、利用し、および再利用する権利
データベースの権利(たとえば「データベースの法的保護に関する指令」(1996年3月11日の、欧州議会および欧州委員会による、96/9/EC指令)、およびその指令のあらゆる国レベルでの履行により生じる権利をいい、そのような指令のあらゆる改正版および後継版により生じる権利を含むものとする。)、および、
その他、世界中で、適用される法令または条約、および、それらのあらゆる国内履行に基づいて生じる、上記各権利に類似し、同等の、または対応する権利。
2.権利放棄 確約者は、適用される法令に基づいて許容され、かつこれに反しない最大限の範囲で、明示的に、完全に、恒久的に、取消不能および無条件の形で、現に知られているか否かにかかわらず、確約者の本作品の著作権および関連する権利、ならびに関連する請求および請求原因(現在および将来の請求および請求原因を含む。)を放棄し、または主張しない(以下、あわせて「権利放棄」という。)。その権利放棄は、(1)世界中のあらゆる地域で、(2)適用される法令または条約により与えられる最大限の期間(将来の期間延長を含む。)について、(3)現在または将来のあらゆる媒体について、かつ複製回数を問わず、(4)商用、広告、または宣伝目的を含むあらゆる利用目的について行うものとする。確約者は、公衆に属するあらゆる者の利益のために、確約者の相続人および承継人に不利益が及ぶ形であっても、権利放棄を行う。この権利放棄は、「目的の説明」において述べたような公衆による本作品の平穏な享受を害するような撤回、取消、解約、解除その他実体法上または衡平法上の訴えの対象としないことをまさに意図して行うものである。

3.パブリックライセンスによる補完 権利放棄のいずれかの部分について、その理由の如何にかかわらず、適用される法令の下で無効であり、または効力が生じないものと司法上の判断がされたときは、権利放棄の効果は、確約者による「目的の説明」の表明内容を考慮して許容される最大限の範囲で維持される。さらに、確約者は、無効・不効力により影響を受ける人に対し、権利放棄が前記のとおり判断された範囲内において、無償、譲渡不可、再許諾不可、非独占、取消不能および無条件の形で、確約者が本作品について有する著作権および関連する権利の利用を許諾する(以下「利用許諾」という。)。この利用許諾は、(1)世界中のすべての地域で、(2)適用される法令または条約により与えられる最大限の期間(将来の期間延長を含む。)について、(3)現在または将来のあらゆる媒体について、かつ複製回数を問わず、(4)商用、広告、または宣伝目的を含むあらゆる利用目的について行うものとする。その利用許諾は、確約者によって作品にCC0が適用された日から効力が生じたものとみなす。利用許諾のいずれかの部分について、その理由の如何にかかわらず、適用される法令上無効であり、または効力が生じないものと司法上の判断がされたときは、その部分的な無効または効力の不存在は、それ以外の利用許諾を無効化しない。かかる場合において確約者は、(1)本作品についての手元にある著作権および関連する権利を行使しないこと、または(2)本作品に関連するあらゆる請求をせず、および請求原因を主張しないものとし、いずれの場合も確約者が明示的に述べられた「目的の説明」に反する行為をしないことを確約する。

4.制限と免責

確約者が有する一切の商標権または特許権は、この文書によっては放棄されず、他人に譲渡されず、委任されず、または許諾されず、その他の影響を受けることもない。
確約者は本作品を現状のまま提供し、明示であるか黙示であるかを問わず、法令の定めその他の根拠の如何にかかわらず、本作品に関するいかなる表明も保証も提供しない。提供しない表明や保証には、権原の存在、商品性、特定の利用目的への適合性、権利侵害または潜在的な瑕疵その他の欠陥の不存在、正確性、誤りの有無についての表明や保証が含まれるが、これらに限られないものとし、発見可能性の有無を問わず、いずれも適用される法令の下で認められる最大限の範囲とする。
確約者は、本作品、または本作品のあらゆる利用に関連して適用される、他人のすべての権利(あらゆる者の著作権および関連する権利を含み、かつこれに限られない。)について、その処理を行う責任を負わない。さらに確約者は、どのようなものであれ本作品の何らかの態様による利用のために必要な同意、許諾、またはその他の権利を取得する責任を負わない。
確約者は、クリエイティブ・コモンズが本文書の当事者ではなく、このCC0または本作品の利用に関連するいかなる義務または責任を負わないことを理解し、同意する。


よって、製作者は権利の主張および行使を行いません。
・使用者は製作者の情報を明記する必要はありません。
・商用利用などのいかなる用途にも製作者は制限を行いません。
・自作発言、再配布、パーツの流用等も含めて製作者に断り無く自由に行うことができます。
・利用に伴ういかなる責任や賠償を製作者は負いません。
・いかなる法的問題が発生した場合も、利用者が自身の責任で問題の解決を努力する必要があります。

利用者が差し替えるスキンデータやテクスチャの著作権は、その製作者に存在します。
また、本データはMinecraftのキャラクターと類似した形状を持っています。
そのため、Mojang社の商標権その他に基づく以下の制約に注意を払う必要があります。

この制約や権利保護の履行・不履行に関して、製作者は何ら責任を負わず、利用者が責任を負うこととなります。

注意事項


当然ですが、このデータはMinecraft 公式製品ではありません。
Mojang から承認されておらず、Mojang とは関係ありません。


また、当データとMojang社には直接の関係はありませんが、参考としてこちらを熟読してください。
当データ自体も当該ガイドラインに準じて制作を行っています。

Mojang 当社のゲームのブランドおよび資産の使用に関するガイドライン
https://account.mojang.com/terms?ref=ft#brand

非商用利用(通常の場合)は、特に以下の点に注意してください。
・違法、詐欺的、わいせつ、有害、または軽蔑的な行動をとらない。
・Mojang社ブランドまたはMojang社資産に損害または損傷を及ぼす行動をとらない。

また、当モデルデータを商用または収益を上げる目的で使用する場合、
追加で、「商業目的使用に関するガイドライン」をご確認ください。
https://account.mojang.com/terms#commercial


使い方


1. Unity 5.6.3 p1をインストールする。
 ※最新版を入れると必ず失敗するのでこのバージョンを入れる。
 https://unity3d.com/jp/unity/qa/patch-releases/5.6.3p1
 セットアップは解説サイトなどを参考に済ませてください。
 https://mono-pro.net/unity-setup2017
 
2. VRChat公式サイトからSDKをダウンロードする。ログインが必要です。
 https://www.vrchat.net/
vr1.png

vr2.png

3. 72Polygons.unitypackageをダウンロードする
 https://sabowl.sakura.ne.jp/gpsnmeajp/72Polygons.unitypackage

4. これら2つのファイルを、Cドライブ直下にフォルダを作るなどして
 パスの短い場所に置く
 例えば: Cドライブの下に72フォルダを作っておく
vr3.png

4. Unity 3.6.3 p1を起動。

5. NEWで適当なプロジェクトを作る
vr4.png
 
6. 画面上部の「Assets」から「Import Package」、「Custom Package...」をクリック
 ダウンロードした「VRCSDK-(省略).unitypackag」を開く
vr5.png

vr6.png

7. 少し待つと「Import Unity Package」が開くので「Import」をクリック。
 暫く待って「Hold On」画面が消えるのを待つ。(その間操作はできない)
vr7.png

8. 画面上の「Assets」から「Import Package」、「Custom Package...」をクリック
 ダウンロードした「72Polygons.unitypackage」を開く

9. 少し待つと「Import Unity Package」が開くので「Import」をクリック。
 暫く待って「Hold On」画面が消えるのを待つ。(その間操作はできない)

10. dist(モデルの方)をHierarchyエリアにドラッグアンドドロップ。
vr8.png

11. Inspectorから、RotationのYを180に、ScaleをX,Y,Z共に0.6にする。
vr9.png

12. InspectorのAdd Componentをクリック
vr10.png

13. 「Scripts」 → 「VRCSKD2」 → 「VRC_Avatar Descriptor」をクリック
vr12.png

vr13.png

vr14.png

14. 画面上部の「VRChat SDK」から「Settings」をクリック
 画面の指示に従いログインする

vr15.png

15. AccountのCreator Statusをチェックする。
 ここが「Allowed to publish avatars」になっていないとアップロードはできない
 (VRChatをある程度プレイし続けると解除されてメールが来るそうです)

vr16.png

16. 画像を差し替える。
 2048 x 1024のスキンファイル(png形式)を用意する。ドット絵のほうが雰囲気が出るがドットでなくとも良い
 この拡大済みのファイルの市松模様を塗りつぶして作成しても良い。(クリックして原寸)
 base-scale.png
 また、拡大前のドット絵ファイルをここに示す。
 base.png

 すでに作成済みのスキンを使う場合は、画像編集ソフトで拡大すること。
 今回は例としてこのようなファイルを用意したとする。
 up17.png

17. 取り込みたいファイルをUnityのAssetsエリアにドラッグアンドドロップする。
vr18.png

18. Materialsフォルダを開く
vr19.png

19. dist-mat1をクリック

20. Assetsフォルダに戻り、Inspectorの「Main Maps」にある「Albedo」の左の四角に、
 先ほど入れたファイルをドラッグアンドドロップする。
vr20.png

21. 画面上のモデルの画像が差し替わる
vr21.png

22. アップロードをしよう。
 画面上部の「VRChat SDK」から「Show Build Control Panel」をクリック。
vr22.png

23. 「Build & Publish」をクリック
vr23.png

24. 適当な名前をつけて保存する

25. 処理が行われるので少し待つと、Nwe Avatar画面が開く。

26. 名前、説明を入力し、Sharingは「Private」に。
 利用規約に同意するチェック(一番下)にチェックを入れる。
 (もし、Upload Imageにチェックが入っていない場合は、極力入れたほうが成功率が高い)
 Uploadボタンを押す。
vr24.png

27. ここからが長いが、ひたすら待つこと。
 下手に操作したりウィンドウを切り替えると「Processing Upload」で停止することがある。
 (そうなった場合はどうしようもないので、Unityを強制終了する)
vr25.png

28. これで完了です。VRChatを起動しましょう。
vr26.png

29. お疲れさまでした。
vr28.png

vr29.png

参考
〜旅するバーチャルyoutuber〜動く城のフィオ様 の講座、配布形式を多大に参考にさせていただきました。

【♂∩♀17】TwitterアイコンでVRChat用のアバターを作る講座〜バーチャルへの旅のすゝめ参〜
https://www.youtube.com/watch?v=6z7aOWtLlUI&index=0&list=PLbh8BMmmKGWyRT5oOeMeb13PzKk2uFhwR

モデルの作成にはMetasequoiaを使用させていただきました。
posted by gpsnmeajp at 14:53| Comment(0) | TrackBack(0) | 雑感

2018年03月26日

中国製据え置きQRコードスキャナの設定用バーコードを生成してみた記録

中国製据え置きQRコードスキャナのSymcode MJ7580 2D Image Desktop Scannerの設定用バーコードをPC上で生成しようとして悪戦苦闘した記録。

まず、英語版説明書に記載の数字や、日本語版説明書のDatamatrixのデータを元にバーコードを作っても、設定用の音(ピコッ)ではなく、読み取り音(ピッ)が鳴って、単に数値として読み取られてしまう。
なぜかというと、バーコードにバイナリデータが含まれているためだ。

CODE128には、アスキーコードの他にFUNC1,2,3,4という拡張コードが含まれる。
まず普通の読み取り装置ではここは無視されてしまうし、使わない。

ので、AndroidアプリでZxingを使い、生データを読み取った。
結果、次のような並びになっていることがわかった。

例えば改行コード(CR+LF)を付けるバーコードの場合
[FUNC3]090300[.]

で、これがわかったなら次にCODE128を生成するのだが、FUNCを付け加えられるサイトがほぼ無い。

最終的にCODE128の生成にはPythonのcode128 0.3ライブラリに付属しているcode128.exeを利用した。
https://pypi.python.org/pypi/code128/0.3

ソースコードを読んだところ~がFUNCに相当するらしく、以下のコマンドで上記のバーコードが生成できた。
code128 ~3090300. output.svg

なお、Datamatrixの中身と、CODE128の中身は同じ為、どちらかに統一して良い。
おわり。

キーエンスのCODE128解説
https://www.keyence.co.jp/ss/products/autoid/codereader/basic_code128.jsp

以下に私好みの設定バーコードを示す。(クリックで拡大)
setup.png

なお、
通常・高速切替モードは、上のボタンで青色のとき1D・2D読み取り、緑色のとき1D専用モードになる。
抑止・通常切替モードは、上のボタンが青色のときスリープ状態になり、緑色のとき1D・2Dを読み取る。
デフォルトだと使わないときにライトがついたり消えたりするが、後者に設定するとオフにできて便利。

以下によく使いそうなバーコードを列挙しておく。(クリックで拡大)
list.png
posted by gpsnmeajp at 03:45| Comment(4) | TrackBack(0) | トラブル解決

2018年03月25日

中国製据え置きQRコードスキャナを買った。

amazonでレビューを書いたが、せっかくなのでブログにも乗せる。
動画を見てほしい。9千円とは思えないすごい性能だ。

商品ページはこちら(アフェリエイトなし)
製造元サイト: Symcode MJ7580 2D Image Desktop Scanner




今まで据え置き型のQRコードスキャナーというと、日本製で十万円近くする高価なものしかなく、個人で扱うには手出しをしにくかったが、
昨今の中国のQRコード支払い文化の影響か、中国製のQRコードスキャナが安価に出回ってきている。本商品も同様で、購入時には9千円程度で入手できた。

さて、性能はと言うと動画に示す通りだが、「日本の空港などでのQRコードの読み取りにくさ」を体験してきた人にとっては驚きなほど読み取り速度も精度も良い。動画の通り、大きめのQRコード+携帯端末ならば(輝度はある程度上げておく必要があるが)かなり距離が離れていても読み取る。かざす必要すらない。複雑なQRコードの場合は、かざすほど近くに置かなければならないが、それでもすんなり読み取りが行われる。

それでは性能以外の点について。
まず、このバーコードスキャナ、ところどころ(説明書にも)ワイヤレスと表記があるが、ワイヤレスではない(USB2.0である)。大きさもそこそこ大きいのでハンドヘルドでもない。これは仕様を読んでおけばわかると思うので問題ではないだろう。

通信方式は、USBキーボードモードと、USBシリアルモードがあり、説明書に記載のバーコードで切り替える。音の有無や大きさもバーコードで切り替える。(注意: 音のオンオフは設定用バーコードの読み取り時は反映されないが、実際のコードを読み取ると反映されている)

読み取り用ライトは近くに物や手をかざすと自動で点灯し、動きがないと自動で消灯するようになっている。

また、本体上面のボタンにより、通常読み取りモード(青色)と、読み取りづらい場合用の高速(高精度?)読み取りモード(緑色が切り替わる。
この2つのモードでは照明ライトの点灯パターンが変わるほか、読み取るバーコードの種別も変化するようである。
通常読み取りモードでは、物が近づくとライトが点灯するが、スマートフォン画面などの輝度の高いものが近づくと消灯して読み取ろうとする。
一方、高速(高精度?)読み取りモードでは、読み取り中ライトは点灯しっぱなしになり、また1次元バーコードのみを読み取るようになっているようである。読み取りにくい印刷物向けと説明書には記載されている。

日本語の説明書は機械翻訳らしい怪しい日本語だが、技術的な説明書を読み慣れていれば特に問題なく読み解ける。同梱されている薄っぺらい英語併記の説明書はむしろ役に立たないので注意(追記:ただし英語版の方にしか乗っていない操作説明や設定用バーコードもある)。

初期設定は、USBキーボードモード、音量大・英語キーボード・自動改行なしなので、少なくとも最初は説明書のコードを読み取って日本語キーボード設定にしないと記号等がおかしくなるので注意(数字だけならおそらく関係ない)
読み取り感度が良すぎる上に、説明書は1ページに何個もバーコードが乗っているため、設定の際は別途コピーをとるか、手でうまく隠して読み取らせる必要があることに注意。

なお、USBキーボードモードでは日本語QRコードには非対応であるので注意。(英字の羅列になってしまう)
USBシリアルモードでは、SJIS、UTF-8共に問題なくデコードできた。(115200bps、8bit、1bit、ノンパリティで動作。通信モードが異なると読み取り動作を行わないので注意。)

また、RS232Cモードも存在するが、付属のケーブルはUSBのみなので注意。(RS232Cの信号がRJ-45端子に出てるのかもしれない)

設定用バーコードはこちら
http://gpsnmeajp.sblo.jp/article/182801384.html
posted by gpsnmeajp at 17:08| Comment(0) | TrackBack(0) | 日記

2018年02月07日

Hacknetの全画面表示でFPSがおかしくなるときの解消方法

Hacknetという、とても面白いゲームがある。
1000円程度と安いが、とても本格的で面白い。音楽も良いゲームだ。
http://store.steampowered.com/app/365450/Hacknet/?l=japanese

ハッキングシミュレータであり、キーボード叩きゲーである。
UNIX風のコマンドを叩き、映画のホワイトハッカーにでもなったかのような楽しい体験ができる作品だ。
一見おかしな設定も、ゲーム内のテキストファイルをあさってゆくと色々と説明が出てくる。
PCに詳しい人はなりきり体験とあるあるネタとして、
PCに詳しくない人は、PCに興味を持つきっかけや、コマンド操作のチュートリアルとして
どちらもおすすめである。

ところでこのゲーム、なぜか全画面表示でやるとFPSがおかしくなる。
普通はならないらしいが、自分のPCでは10〜999FPSを超絶行き来しており、
その上実際は10FPSくらいが不安定に出る感じで、うまく動かない。

ウィンドウモードでは60FPSで動くのだが、全画面にするととたんにダメになる。
ウィンドウモードでプレイしたが、没入感に欠ける。

で、この度PCをSSDにしたついでに解決策を探してみた。
結果、ビデオカードの「垂直同期」を「アプリケーション依存」から「強制オン」に切り替えたところ、
60FPSで安定して動くようになった。FPS自動調節機能でも誤動作していたのだろうか?

ともかく、これで没入感たっぷりで遊べるようになった。
posted by gpsnmeajp at 00:05| Comment(0) | TrackBack(0) | トラブル解決

2018年02月03日

Felica Liteの中身をダンプしたりNDEFタグ化したりするツール作った

EasyPCSCFelicaLiteConsoleを作りました.
タイトルの通り,Felica Liteの中身をダンプしたりNDEFタグ化したりするツールです.
いろいろ入れたりする必要なく,EXEファイル1つとPaSoRiの標準PC/SCドライバで動く軽量ツールです.
https://sabowl.sakura.ne.jp/gpsnmeajp/cpp/easypcscfelicaliteconsole/

shot1.png

ここ数日開発していたライブラリのLazyPCSCFelicaliteは,これを作るため以前作成したプログラムをライブラリ化していたら火がついてしまって作り込んでしまったものです.

こちらはこちらで,MACを使用した片側認証・相互認証に対応した力作です.
ライセンスも緩めですので,どうぞご利用ください.
https://sabowl.sakura.ne.jp/gpsnmeajp/cpp/lazypcscfelicalite/
posted by gpsnmeajp at 23:28| Comment(0) | TrackBack(0) | プログラム

2017年12月04日

Intel rapid storage technologyを削除したらHDDの平均応答時間が早くなった?

最近PCがやたら重い。

HDDの平均応答時間が500msとかおかしな値になっていたので、
ぐぐってみると、Intel rapid storage technologyが導入されていないと起きるとのこと。
しかし、導入されている。謎である。

試しにIntel rapid storage technology削除してみたが、変化が起きない。
そこでさらに、SATAコントローラのドライバを削除してみた。

見事にWindowsが起動しなくなったが、セーフモードで起動後、再起動すると問題なく起動した。
ドライバがかなり古いものにフォールバックしたが、その結果、平均応答時間が3〜50ms程度と大きく改善した。
何だったのだろう。
posted by gpsnmeajp at 00:09| Comment(0) | TrackBack(0) | トラブル解決

2017年11月29日

YubikeyのU2F認証の仕組み(登録件数が無限なしくみ)

Yubikeyは、セキュアエレメント搭載のセキュリティーキーですが、
そういえばFIDOのU2Fには何件対応しているのだろう、と思いました。

FIDOのU2Fは、認証デバイスが鍵ペアを生成して保管し、
それを認証デバイス側と、サイト側で相互に突き合わせて強固な認証を行います。

Yubikey内のストレージは有限かつ少量で、それは各機能の登録データ数の制限等を見ると明らかです。
しかしながら、U2F認証を要求するサイトは数十、数百と増えるでしょう。
そうした時に、上限に達したらどうなるのか?

これ以上登録できませんとなるのか?削除の仕組みがある?それともまさか古い順に削除される?
調べてみると、公式サイトに回答がありました。

how many services can the u2f-certified YubiKeys be associated with?
https://www.yubico.com/support/knowledge-base/categories/articles/many-services-can-u2f-certified-yubikeys-associated/

「利用できるサービスの数の制限はありません。
 鍵ペアは生成されますが、デバイスには保存されず、登録サービスに保存されます。
 そのため実質的に無限に登録できます。」

最初これを見たとき、「え?」となりました。
・鍵ペアをサービスに保存したら意味なくない?
・Yubikeyからどうやって認証してるんだ?
・そもそもFIDOの仕様に、サイト側に保存する仕組みなんてあったっけ?

開発者向けサイトに答えがありました。
なかなかおもしろい仕組みを使って実装されています。

Key generation - Yubico Developers
https://developers.yubico.com/U2F/Protocol_details/Key_generation.html

ただしこれも理解に時間がかかったので、自分の理解の結果を以下に示します。
誤りが含まれているかもしれません。上記のURLの内容そのままといえばそのままですので、ご確認ください。

前提
・キーデバイスは、AppID(ドメイン名含む)でサイトを識別する。(これがフィッシング対策になる)
・同じサイトで、違うアカウントの認証情報が必要な場合があり、AppIDでは識別できない。
 そのために鍵の識別はKeyHandleを用いて行う。このKeyHandleは、デバイスが生成してサイトに送る。
・しかし、そうしたところで、セキュアなストレージが大量に必要になる。
 FIDOは鍵の格納方法を指定していないため、Yubikeyでは違ったアプローチをしている。

登録フェーズ
1. Webサービスは、AppID、Challenge(リプレイ攻撃対策乱数)とともに登録リクエストをする
2. Yubikey内で、乱数からNonceを生成する。
3. Yubikey内で、AppIDとNonceをデバイス内部鍵(固定)で署名ハッシュを取り、
 これを秘密鍵とする。
4. Yubikey内で、秘密鍵から公開鍵を生成する。
5. Yubikey内で、AppIDと秘密鍵、デバイス内部鍵(固定)で署名ハッシュを取り、
 秘密鍵ハッシュ(MAC)を生成する。
6. Yubikey内で、NonceとMACの一部を結合し、KeyHandleとする。
7. Yubikey内で、公開鍵・KeyHandle・Challenge・AppIDを秘密鍵で署名し、サービスに返す。
8. 内部カウンタを加算する。

認証フェーズ
1. Webサービスは、AppIDとKeyHandle、Challenge(リプレイ攻撃対策乱数)を渡して認証要求する
2. Yubikey内で、KeyHandleから登録時のNonceと秘密鍵MACを取り出す
3. Yubikey内で、AppIDとNonceをデバイス内部鍵(固定)で署名ハッシュを取り、これを秘密鍵とする。
4. Yubikey内で、秘密鍵から公開鍵を生成する。
5. Yubikey内で、AppIDと秘密鍵、デバイス内部鍵(固定)で署名ハッシュを取り、
 秘密鍵MACを生成する。これを、KeyHandleから取り出したMACと比較し、正しいか検証する。
 (正しくなければ、これはこのYubikeyのものではないか、あるいは改変されている)
6. Yubikey内で、KeyHandle・Challenge・AppIDを署名し、サービスに返す。
7. 内部カウンタを加算する。

結論として、Yubikey内には、秘密鍵も公開鍵もKeyHandleも保存されない。
デバイス内部鍵は、Yubikeyに出荷時に書き込まれているものであり、取り出しも変更もできない。
内部的に変化するのはカウンタだけである。

秘密鍵は、NonceとAppIDと、デバイス内鍵の3つから「毎回」生成されている。
Nonceは、登録時は乱数だが、認証時は登録時に渡したKeyHandleがサービスから帰ってくる。
KeyHandleは、Nonceと秘密鍵MACを結合したものであり、そのためこれで秘密鍵生成データが揃うことになる。

このままだと、全く登録していないサービスなどから要求されても、
無効な署名を渡してしまうが、それはKeyHandleに含まれている秘密鍵MACを使うことで
KeyHandleが自分が生成したものかをチェックできる仕組みになっている。

よくできている。
posted by gpsnmeajp at 14:08| Comment(0) | TrackBack(0) | 日記