約 3,341,920 件
https://w.atwiki.jp/nico_tkool/pages/22.html
水銀燈 ~Bizarre Adventure~ 作者:森部日勝 使用ツール:RPGツクール2000 シリーズ総数:19 シリーズリスト:【ニコニコ動画】水銀燈 ~Bizarre Adventure~ ある日JUNの家に遊びに行った水銀燈は、彼の変わり果てた姿であるKBCに襲われる。 KBCの力によって異世界に飛ばされた水銀燈は、 そこを支配しようと目論む十賢者を倒し、JUNを元に戻す旅に出る。 作者自身はこの作品がドキクエシリーズから強く影響を受けていると公言している。 その言葉通り、登場するキャラは最初の仲間からしてMMRのキバヤシと非常に濃い面子が揃っており、 会話イベントやストーリーの流れから上記シリーズに類するカオスを楽しむことができる。 なお、作品全体の印象としてはドキドキクエストシリーズの中でもイベント重視のAct Cadenzaよりも 勢いに乗せてテンポよくストーリーが進行していくⅠ・Ⅱに近いように見受けられる。
https://w.atwiki.jp/current_exorcist/
このウィキの使い方 ~4つのステップ~ ■ログインしてみよう! デザインを変えたり、サイト名を変えたりするためには、ログインしないといけないよ。 ログインの方法は、下の手順でログインしてみよう! わからない場合はこちらのページも参考にしてね。 画面の右上にある「ログイン」をクリック! ユーザ名に「current_exorcist」、パスワードには、登録の時に設定したものを入力しよう。 画面の右上に「current_exorcist」と表示されればログイン完了! ■サイト名を変更しよう! サイト名はどこから変えれるの?下の手順にそえばサイト名を変えれるよ! わからない場合はこちらのページも参考にしてね。 ログインしたら、右上にある「設定」をクリック! 表示されたページの左メニューにある、「基本設定」をクリックしよう! そうすると、一番上の「サイト名」と書かれた右側に、今のサイト名が書かれています。 ここを好きな名前に書き換えよう! 書き換え終わったら、一番下にある「設定変更」ボタンをクリック! 右上の 「(設定したサイト名)」へ戻る をクリックすると、サイト名が変わったことが確認できるよ! ■新しいページを作成しよう! 新しくページを作成するにはどうすればいいのか、下の手順にそってやってみよう! わからない場合はこちらのページも参考にしてね。 画面の左上にある「@メニュー」にマウスを持って行くと、さらにメニューが表示されます。 表示されたメニューから「新規ページ作成」をクリック! 表示されたページで、作りたいページの名前を入力して、 編集モードは 【初心者向け】ワープロモード を選択しよう。 真ん中の枠の中に、自由に書き込めるよ! 作り終わったら、「ページを保存」をクリックすれば、新しいページの作成は完了! ■このページを編集しよう! 最後に、このトップページを編集しよう! ページ編集の方法がわからない場合はこちらのページも参考にしてね。 左上にある「編集」にマウスを持って行くと、さらにメニューが表示されます。 表示されたメニューから「ページ編集」をクリック! 編集画面が表示されるので、自由に書き換えてみよう。 書き換え終わったら、「ページを保存」をクリックすれば、トップページの編集は完了! もし、wikiで議論する場や掲示板が欲しい場合は? @wikiの姉妹サービスである@chsをご利用ください。 登録はこちらから ← ここをクリックしてください。 分からないことは? @wiki ご利用ガイド よくある質問 無料で会員登録できるSNS内の@wiki助け合いコミュニティ @wiki更新情報 @wikiへのお問合せフォーム 等をご活用ください その他お勧めサービスについて 大容量1G、PHP/CGI、MySQL、FTPが使える無料ホームページは@PAGES 無料ブログ作成は@WORDをご利用ください 2ch型の無料掲示板は@chsをご利用ください フォーラム型の無料掲示板は@bbをご利用ください お絵かき掲示板は@paintをご利用ください その他の無料掲示板は@bbsをご利用ください 無料ソーシャルプロフィールサービス @flabo(アットフラボ) バグ・不具合を見つけたら? 要望がある場合は? お手数ですが、お問い合わせフォームからご連絡ください。
https://w.atwiki.jp/legendofnorrath/pages/450.html
Update Notes for August 12th, 2009 ******************************************Gameplay - Dagger of Slaying and Blazon Life now work correctly in match play games.- Storm Guard Smith now works properly with Disintegrate. - Slag Elemental now correctly gives runes to just friendly elementals and will no longer gives itself +1 rune. - Guard s Legplates will no longer trigger twice when used with Terror of Darkness. - Tellurian Myrmirdon can no longer use its main phase gametext when this unit is exerted. - Divine Aura will now block linked damage to your avatar. - Armor of the Sacred will no longer destroy one of your own exerted abilities. - Robe of the Oracle will now work correctly with the Bulwark keyword.General - Storm Break decks now validate properly in Storm Break-only format. - Coilwork Spitter cards incorrectly showing as foils have been replaced with the correct non-foil version.Text - Chat log entry for Tellurian Myrmidon has been corrected. - Painting Mayong Mistmoore (5EQ2P2) is now spelled correctly.
https://w.atwiki.jp/anime_wiki/pages/13640.html
ここを編集 2006 ■妖逆門(制作協力) 2010 ■B型H系(制作協力) 2015 ■グリザイアの迷宮(制作協力 スタジオパストラルと共同) 2020 ■君は彼方 2023 ■婚約破棄された令嬢を拾った俺が、イケナイことを教え込む(ゼロジーと共同) ■関連タイトル 婚約破棄された令嬢を拾った俺が、イケナイことを教え込む Blu-ray BOX Blu-ray B型H系 1 こわいもの知らず[笑]無修正版 rakuten_design= slide ;rakuten_affiliateId= 053df7e0.7c451bd1.0c852203.190c5695 ;rakuten_items= ctsmatch ;rakuten_genreId=0;rakuten_size= 468x160 ;rakuten_target= _blank ;rakuten_theme= gray ;rakuten_border= on ;rakuten_auto_mode= on ;rakuten_genre_title= off ;rakuten_recommend= on ; 随時更新! pixivFANBOX アニメ@wiki ご支援お待ちしています! ムック本&画集新刊/個人画集新刊/新作Blu-ray単巻/新作Blu-ray DVD-BOX アニメ原画集全リスト スタッフインタビューwebリンク集 最新登録アイテム Switch ゼルダの伝説 Tears of the Kingdom Switch 世界樹の迷宮Ⅰ・Ⅱ・Ⅲ HD REMASTER Switch ピクミン 4 大友克洋 Animation AKIRA Layouts Key Frames 2 小説 機動戦士ガンダム 水星の魔女 1 ONE PIECE FILM REDデラックス・リミテッド・エディション 4K ULTRA HD Blu-ray Blu-ray 劇場版 ソードアート・オンライン -プログレッシブ- 冥き夕闇のスケルツォ 完全生産限定版 Blu-ray 映画『ゆるキャン△』 Blu-ray 【コレクターズ版】 Blu-ray ウマ娘 プリティーダービー 4th EVENT SPECIAL DREAMERS!! Blu-ray 天地無用!GXP パラダイス始動編 Blu-ray第1巻 特装版 天地無用!魎皇鬼 第伍期 Blu-ray SET 「GS美神」全話いっき見ブルーレイ Blu-ray ソードアート・オンライン -フルダイブ- メーカー特典:「イベントビジュアル使用A3クリアポスター」付 ラブライブ!虹ヶ咲学園スクールアイドル同好会 5th Live! 虹が咲く場所 Blu-ray Memorial BOX 宇宙戦艦ヤマト2202 愛の戦士たち Blu-ray BOX 特装限定版 地球へ… Blu-ray Disc BOX 完全生産限定版 神風怪盗ジャンヌ Complete Blu-ray BOX HUNTER×HUNTER ハンター試験編・ゾルディック家編Blu-ray BOX BLEACH Blu-ray Disc BOX 破面篇セレクション1+過去篇 完全生産限定版 MAZINGER THE MOVIE 1973-1976 4Kリマスター版 アニメ・ゲームのロゴデザイン シン・仮面ライダー 音楽集 テレビマガジン特別編集 仮面ライダー 完全版 EPISODE No.1~No.98 MOVIE リスアニ!Vol.50.5 ぼっち・ざ・ろっく!号デラックスエディション ヤマノススメ Next Summit アニメガイド おもいでビヨリ アニメ「魔入りました!入間くん」オフィシャルファンブック 『超時空要塞マクロス』パッケージアート集 CLAMP PREMIUM COLLECTION X 1 トーマの心臓 プレミアムエディション パズル ドラゴンズ 10th Anniversary Art Works はんざわかおり こみっくがーるず画集 ~あばばーさりー!~ あすぱら画集 すいみゃ Art Works trim polka-トリムポルカ- つぐもも裏 超!限界突破イラスト&激!すじ供養漫画集 開田裕治ウルトラマンシリーズ画集 井澤詩織1st写真集 mascotte 鬼頭明里写真集 my pace 内田真礼 1st photobook 「まあやドキ」 進藤あまね1st写真集 翠~Midori~ 声優 宮村優子 対談集 アスカライソジ 三石琴乃 ことのは 亀田祥倫アートワークス 100% 庵野秀明責任編集 仮面ライダー 資料写真集 1971-1973 金子雄司アニメーション背景美術画集 タローマン・クロニクル ラブライブ!サンシャイン!! Find Our 沼津~Aqoursのいる風景~ 機動戦士ガンダム 逆襲のシャア 友の会[復刻版] 梅津泰臣 KISS AND CRY 資料集 安彦良和 マイ・バック・ページズ 『機動戦士ガンダム ククルス・ドアンの島』編 氷川竜介 日本アニメの革新 歴史の転換点となった変化の構造分析 Blu-ray THE IDOLM@STER CINDERELLA GIRLS 10th Anniversary Celebration Animation ETERNITY MEMORIES Blu-ray おいら宇宙の探鉱夫 ブルーレイ版 Blu-ray 映画 バクテン!! 完全生産限定版 アイカツ! 10th STORY ~未来へのSTARWAY~ Blu-ray BOX 初回生産限定版 はたらく細胞 Blu-ray Disc BOX 完全生産限定版 Blu-ray 長靴をはいた猫 3作品収録 Blu-ray わんぱく王子の大蛇退治 Blu-ray 魔道祖師 完結編 完全生産限定版 魔道祖師Q Blu-ray Disc BOX 完全生産限定盤 にじよん あにめーしょん Blu-ray BOX 【特装限定版】 Blu-ray 鋼の錬金術師 完結編 プレミアム・エディション Blu-ray付き やはりゲームでも俺の青春ラブコメはまちがっている。完 限定版【同梱物】オリジナルアニメ Blu-ray「だから、思春期は終わらずに、青春は続いていく。」
https://w.atwiki.jp/kerberos04/pages/86.html
Parents カルロス・フランケンシュタイン 〈 No Image 〉 ♂ 42 ヒューマン like: ? hate: ? リィアの父。ダーカーについて研究している研究員。研究していた「ダーカー因子による生命組成」の研究資料が何かしらの理由で【仮面】に見つかり、それを抹消しようと【仮面】が休暇中のカルロスを殺すべく市街地を強襲、その際行方不明となる。 【仮面】は駆けつけたミストグレーによって追い払われ、研究資料はロズが持ち出したため無事。 アリア・フランケンシュタイン 〈 No Image 〉 ♀ ?? ??? like: ? hate: ? [Deleted] 戻る
https://w.atwiki.jp/animeskysatellite/pages/14.html
アニメの声優リストです。 以下の項目から選択して閲覧してください。 女性声優 五十音別アニメ女性声優リスト 生年月日別アニメ女性声優リスト 男性声優 五十音別アニメ男性声優リスト 生年月日別アニメ男性声優リスト
https://w.atwiki.jp/current_exorcist/pages/5.html
このウィキの使い方 ~4つのステップ~ ■ログインしてみよう! デザインを変えたり、サイト名を変えたりするためには、ログインしないといけないよ。 ログインの方法は、下の手順でログインしてみよう! わからない場合はこちらのページも参考にしてね。 画面の右上にある「ログイン」をクリック! ユーザ名に「current_exorcist」、パスワードには、登録の時に設定したものを入力しよう。 画面の右上に「current_exorcist」と表示されればログイン完了! ■サイト名を変更しよう! サイト名はどこから変えれるの?下の手順にそえばサイト名を変えれるよ! わからない場合はこちらのページも参考にしてね。 ログインしたら、右上にある「設定」をクリック! 表示されたページの左メニューにある、「基本設定」をクリックしよう! そうすると、一番上の「サイト名」と書かれた右側に、今のサイト名が書かれています。 ここを好きな名前に書き換えよう! 書き換え終わったら、一番下にある「設定変更」ボタンをクリック! 右上の 「(設定したサイト名)」へ戻る をクリックすると、サイト名が変わったことが確認できるよ! ■新しいページを作成しよう! 新しくページを作成するにはどうすればいいのか、下の手順にそってやってみよう! わからない場合はこちらのページも参考にしてね。 画面の左上にある「@メニュー」にマウスを持って行くと、さらにメニューが表示されます。 表示されたメニューから「新規ページ作成」をクリック! 表示されたページで、作りたいページの名前を入力して、 編集モードは 【初心者向け】ワープロモード を選択しよう。 真ん中の枠の中に、自由に書き込めるよ! 作り終わったら、「ページを保存」をクリックすれば、新しいページの作成は完了! ■このページを編集しよう! 最後に、このトップページを編集しよう! ページ編集の方法がわからない場合はこちらのページも参考にしてね。 左上にある「編集」にマウスを持って行くと、さらにメニューが表示されます。 表示されたメニューから「ページ編集」をクリック! 編集画面が表示されるので、自由に書き換えてみよう。 書き換え終わったら、「ページを保存」をクリックすれば、トップページの編集は完了! もし、wikiで議論する場や掲示板が欲しい場合は? @wikiの姉妹サービスである@chsをご利用ください。 登録はこちらから ← ここをクリックしてください。 分からないことは? @wiki ご利用ガイド よくある質問 無料で会員登録できるSNS内の@wiki助け合いコミュニティ @wiki更新情報 @wikiへのお問合せフォーム 等をご活用ください その他お勧めサービスについて 大容量1G、PHP/CGI、MySQL、FTPが使える無料ホームページは@PAGES 無料ブログ作成は@WORDをご利用ください 2ch型の無料掲示板は@chsをご利用ください フォーラム型の無料掲示板は@bbをご利用ください お絵かき掲示板は@paintをご利用ください その他の無料掲示板は@bbsをご利用ください 無料ソーシャルプロフィールサービス @flabo(アットフラボ) バグ・不具合を見つけたら? 要望がある場合は? お手数ですが、お問い合わせフォームからご連絡ください。
https://w.atwiki.jp/katteorg/pages/46.html
Best of 2010 ランキング ミュージック アニメ (集計期間 2009年12月1日~2010年11月30日) 1.ONE PIECE MEMORIAL BEST(初回限定盤)(DVD付) ~ TVサントラ 2.My Soul, Your Beats!/Brave Song 【初回生産限定盤】 ~ Lia 3.TVアニメ「けいおん!!」オープニングテーマ GO!GO! MANIAC(初回限定盤) ~ 放課後ティータイム 4.坂本真綾 15周年記念ベストアルバム everywhere(初回限定盤)(DVD付) ~ 坂本真綾 5.TVアニメ「けいおん!!」エンディングテーマ Listen!!(初回限定盤) ~ 放課後ティータイム 6.TVアニメ「けいおん!!」エンディングテーマ NO,Thank You!(初回限定盤) ~ 放課後ティータイム〔平沢唯・秋山澪・田井中律・琴吹紬・中野梓(CV 豊崎愛生、日笠陽子、佐藤聡美、寿美菜子、竹達彩奈)〕 7.鋼の錬金術師 FULLMETAL ALCHEMIST FINAL BEST(DVD付) ~ TVサントラ 8.TVアニメ「けいおん! ! 」劇中歌集 放課後ティータイム II(初回限定盤) ~ 放課後ティータイム 9.TVアニメ「けいおん!!」オープニングテーマ Utauyo!!MIRACLE(初回限定盤) ~ 放課後ティータイム〔平沢唯・秋山澪・田井中律・琴吹紬・中野梓(CV 豊崎愛生、日笠陽子、佐藤聡美、寿美菜子、竹達彩奈)〕 10.Keep The Beats! ~ Girls Dead Monster
https://w.atwiki.jp/mapds/pages/74.html
POPS アニメ POPS アニメ 曲名 作曲/演唱 EXP MAS Re MAS 宴 Dropbox 1.4.2 Egoist - 12+ - - 下載 AMAZING BREAK 堀江晶太 - 12 - - 下載 BRAVE JEWEL Roselia(バンドリ!) - 12+ - - 下載 chAngE miwa - 12+ - - 下載 DADDY ! DADDY ! DO ! 鈴木雅之feat. 鈴木愛理 - 11 12 - 下載 Easy come, Easy go! Afterglow(バンドリ!) - 12+ - - 下載 Friend HoneyComeBear - 13 - - 下載 Future ★STAR GUiTAR [cover] - 13 - - 下載 GHOST 星街すいせい - 12+ - - 下載 INSIDE IDENTITY Black Raison d'être - 11+ - - 下載 LAZY DUSTCELL - 12 - - 下載 Long shot 前島麻由 - 11+ - - 下載 Mirror HoneyComeBear - 12 - - 下載 Ocean Blue (feat. Laura Brehm) WRLD - 12+ 13 - 下載 Palette 常闇トワ - 12 - - 下載 PASSIONATE ANTHEM Roselia(バンドリ!) - 12+ - - 下載 Realize 鈴木このみ - 13 - - 下載 Returns Poppin'Party(バンドリ!) - 11+ - - 下載 Rising Hope LiSA - 12 - - 下載 Say!ファンファーレ! 白上フブキ - 11 - - 下載 Share the light (Leck ver.) Run Girls, Run! - 12+ - - 下載 Share the light (MF- ver.) Run Girls, Run! - - 12 - 下載 Solo (feat. Demi Lovato) Clean Bandit - 13+ - - 下載 Song I am Roselia(バンドリ!) - 13 - - 下載 The Everlasting Guilty Crown EGOIST - 11+ - - 下載 お勉強しといてよ ずっと真夜中でいいのに。 - 12 - - 下載 ここにいる (Stephen Walking Remix) Aiobahn feat. rionos - 12 - - 下載 アイデンティティ(By MF-) 秋山黄色 - 12+ - - 下載 アイデンティティ(By Jakasy) 秋山黃色 - 13 - - 下載 アイのシナリオ CHiCO with HoneyWorks - 11+ - - 下載 アンコール YOASOBI - 12+ - - 下載 インフェルノ Mrs. GREEN APPLE - 12 - 炎 下載 カワキヲアメク 美波 - 12 - - 下載 トリカゴ XX me - 11 - - 下載 ミカヅキ さユり - 11+ - - 下載 パレード ヨルシカ(n-buna) - 11+ - - 下載 レイメイ さユり×MY FIRST STORY - 12 - - 下載 ユナイト 三澤紗千香 - 12 - - 下載 ヨミガエレ フランシュシュ - 13 - - 下載 言って。(By Jakasy) ヨルシカ - 13 - - 下載 言って。(By MF-) ヨルシカ - 12 - - 下載 打上花火 DAOKO × 米津玄師 - 11 - - 下載 命の行方 DUSTCELL - 13 14 - 下載 魔法 Myuk - 11+ - - 下載 蝶々結び Aimer - 12 - - 下載 名前のない怪物 EGOIST - 12 - - 下載 彼女は旅に出る 冰鎮豆沙君 - 12 - - 下載 夜に駆ける Ayase - 12 - - 下載 春擬き やなぎなぎ - 11+ - - 下載 不專心 黃氏兄弟 - 12+ - - 下載 天下無敵☆メテオレンジャー! 流星隊 - 12 - - 下載
https://w.atwiki.jp/opengl/pages/150.html
.xの階層アニメーションを読み込んで再生するプログラムが完成したので公開します。 クォータニオンの符号の判定には皆さん、苦労されたのではないでしょうか。 ネットで広く公開されているサンプルはほとんどがDirectX用で いちいち転置しなければならなかったり。 左手座標用に作成したアニメーションXファイルはクォータニオンのY軸とZ軸を-1倍しないと OpenGLではおかしな表示になるとか。 回転角度が181度とマイナス179度ではクォータニオンの符号が反転してるけど 同じ回転行列になるとか。 いやはや、手間取りました。 最後に親階層から子階層へ脈々と行列を受け継いで完成です。 『固定機能 階層メッシュアニメーション編』の『階層構造』で作成した sample4.xを表示しています。 尚、Cyberdelia で作成したアニメーションXファイルだけに対応しています。 font.h #pragma once class GLFONT { public HFONT Hfont; HDC Hdc; GLFONT(wchar_t *fontname, int size); void DrawStringW(int x,int y,wchar_t *format, ...); }; //コンストラクタ フォント作成 GLFONT GLFONT(wchar_t *fontname, int size) { Hfont = CreateFontW( size, //フォント高さ 0, //文字幅 0, //テキストの角度 0, //ベースラインとx軸との角度 FW_REGULAR, //フォントの太さ FALSE, //イタリック体 FALSE, //アンダーライン FALSE, //打ち消し線 SHIFTJIS_CHARSET, //文字セット OUT_DEFAULT_PRECIS, //出力精度 CLIP_DEFAULT_PRECIS, //クリッピング精度 ANTIALIASED_QUALITY, //出力品質 FIXED_PITCH | FF_MODERN, //ピッチとファミリー fontname); //書体名 Hdc = wglGetCurrentDC(); SelectObject(Hdc, Hfont); } //ワイド文字列の描画 void GLFONT DrawStringW(int x,int y,wchar_t *format, ...) { wchar_t buf[256]; va_list ap; int Length=0; int list=0; //ポインタがNULLの場合は終了 if ( format == NULL ) return; //文字列変換 va_start(ap, format); vswprintf_s(buf, format, ap); va_end(ap); Length = wcslen(buf); list = glGenLists(Length); for( int i=0; i wglUseFontBitmapsW(Hdc, buf[i], 1, list + (DWORD)i); } glDisable(GL_LIGHTING); glRasterPos2i(x, y); //ディスプレイリストで描画 for( int i=0; i { glCallList(list + i); } glEnable(GL_LIGHTING); //ディスプレイリスト破棄 glDeleteLists(list, Length); list = 0; Length = 0; } PNG.h #pragma once #include lodepng.h //テクスチャクラス class TEXTURE{ protected LodePNG_Decoder decoder;//デコーダ unsigned char* buffer;//バッファ size_t buffersize, imagesize;//サイズ public TEXTURE(); TEXTURE(const char* FileName);//コンストラクタ void LOAD_PNG(const char* FileName);//PNG読み込み unsigned char* image;//イメージポインタ unsigned int Width,Height;//画像サイズ }; TEXTURE TEXTURE(){ } TEXTURE TEXTURE(const char* FileName){ LOAD_PNG(FileName); } void TEXTURE LOAD_PNG(const char* FileName){ LodePNG_Decoder_init( decoder); //ロード LodePNG_loadFile( buffer, buffersize, FileName); //デコード LodePNG_decode( decoder, image, imagesize, buffer, buffersize); //幅,高さ Width = decoder.infoPng.width;Height = decoder.infoPng.height; } xfile.h #pragma once #include PNG.h #include math.h #define PAI 3.14159 using namespace std; struct MATRIX; //クォータニオン構造体 struct QUATERNION{ union { struct { float w; float x; float y; float z; }; float Index[4]; }; MATRIX ToMatrix();//クォータニオンを回転行列にする }qua; //マトリクス構造体 struct MATRIX { union { struct { float _11, _12, _13, _14; float _21, _22, _23, _24; float _31, _32, _33, _34; float _41, _42, _43, _44; }; float mat_4x4[4][4]; float mat_16[16]; }; MATRIX(){//単位行列に初期化 for(int i=0;i 16;i++){ this- mat_16[i]=0; } this- _11=this- _22=this- _33=this- _44=1; } void PRINT(char* text){ printf( %s\n%f,%f,%f,%f\n%f,%f,%f,%f\n%f,%f,%f,%f\n%f,%f,%f,%f\n\n , text, this- _11,this- _21,this- _31,this- _41, this- _12,this- _22,this- _32,this- _42, this- _13,this- _23,this- _33,this- _43, this- _14,this- _24,this- _34,this- _44); } MATRIX Multiplication(MATRIX mat);//合成 QUATERNION ToQuaternion();//回転行列をクォータニオンにする }; //合成 MATRIX MATRIX Multiplication(MATRIX mat) { MATRIX ret; for(int y=0;y 4;y++){ for(int x=0;x 4;x++){ ret.mat_16[y*4+x]=mat.mat_16[y*4]*this- mat_16[x]+mat.mat_16[y*4+1]*this- mat_16[x+4]+mat.mat_16[y*4+2]*this- mat_16[x+8]+mat.mat_16[y*4+3]*this- mat_16[x+12]; } } return ret; } float SGN(float x) { return (x = 0.0f) ? +1.0f -1.0f; } //回転行列をクォータニオンにする QUATERNION MATRIX ToQuaternion(){ QUATERNION q; q.w = ( this- _11 + this- _22 + this- _33 + 1.0f) / 4.0f; q.x = ( this- _11 - this- _22 - this- _33 + 1.0f) / 4.0f; q.y = (-this- _11 + this- _22 - this- _33 + 1.0f) / 4.0f; q.z = (-this- _11 - this- _22 + this- _33 + 1.0f) / 4.0f; for(int i=0;i 4;i++){ if(q.Index[i] 0.0f) q.Index[i] = 0.0f; q.Index[i] = sqrt(q.Index[i]); } if(q.w = q.x q.w = q.y q.w = q.z) { q.w *= +1.0f; q.x *= SGN(this- _23 - this- _32)*SGN(this- _31 - this- _13)*SGN(this- _12 - this- _21); q.y *= SGN(this- _23 - this- _32)*SGN(this- _31 - this- _13)*SGN(this- _12 - this- _21); q.z *= SGN(this- _23 - this- _32)*SGN(this- _31 - this- _13)*SGN(this- _12 - this- _21); } else { q.w *= +1.0f*-1; q.x *= SGN(this- _23 - this- _32)*SGN(this- _31 - this- _13)*SGN(this- _12 - this- _21)*-1; q.y *= SGN(this- _23 - this- _32)*SGN(this- _31 - this- _13)*SGN(this- _12 - this- _21)*-1; q.z *= SGN(this- _23 - this- _32)*SGN(this- _31 - this- _13)*SGN(this- _12 - this- _21)*-1; } float nor = sqrt(q.w * q.w + q.x * q.x + q.y * q.y + q.z *q.z); for(int i=0;i 4;i++){ q.Index[i] /= nor; } return q; } //クォータニオンを回転行列にする MATRIX QUATERNION ToMatrix(){ MATRIX ret; float sx = this- x * this- x; float sy = this- y * this- y; float sz = this- z * this- z; float cx = this- y * this- z; float cy = this- x * this- z; float cz = this- x * this- y; float wx = this- w * this- x; float wy = this- w * this- y; float wz = this- w * this- z; ret._11= 1.0f - 2.0f * (sy + sz); ret._12= 2.0f * (cz + wz); ret._13= 2.0f * (cy - wy); ret._21= 2.0f * (cz - wz); ret._22= 1.0f - 2.0f * (sx + sz); ret._23= 2.0f * (cx + wx); ret._31= 2.0f * (cy + wy); ret._32= 2.0f * (cx - wx); ret._33= 1.0f - 2.0f * (sx + sy); ret._41= 0.0f; ret._42= 0.0f; ret._43= 0.0f; return ret; } //3つのベクトル struct Vector3f{ float x; float y; float z; }vec3d; Vector3f operator*(Vector3f v,float size){ v.x *= size; v.y *= size; v.z *= size; return v; } Vector3f operator+(Vector3f a,Vector3f b){ a.x+=b.x; a.y+=b.y; a.z+=b.z; return a; } //4つのベクトル struct Vector4f{ float x; float y; float z; float w; }vec4d; //4つのカラー struct Color4{ float r; float g; float b; float a; }; //4つの反射 struct Reflection4{ Color4 diffuse; Color4 ambient; Color4 emission; Color4 specular; }; //UV座標 struct UV{ float u;//u値 float v;//v値 }vec2d; //ポリゴンデータ struct Triangle{ Vector3f TriVer; Vector3f TriNor; UV TriUV; }Tri; //ポリゴンデータ struct Quadrangle{ Vector3f QuadVer; Vector3f QuadNor; UV QuadUV; }Quad; //マテリアル構造体 struct MATERIAL{ string MaterialName;//マテリアル名 Reflection4 MaterialColor;//反射 float Shininess;//shininess string TextureName;//テクスチャ名 int TexNo;//テクスチャNO. vector Triangle Tridata;//三角面データ vector Quadrangle Quaddata;//四角面データ }mtl; //メッシュ構造体 struct MESH{ public vector MATERIAL Material;//マテリアル vector TEXTURE* TexData;//テクスチャデータ vector GLuint TexID;//テクスチャID GLuint TexID2;//代入用 TEXTURE* tex;//代入用 }msh; //アニメーションデータ構造体 struct ANIMATION{ public vector int Key;//アニメーションキー vector MATRIX Matrix;//行列データ }anm; //ノード構造体 struct NODE{ NODE* Node;//子ノード NODE* Next;//隣の階層 string FrameName;//フレーム名 MESH* Mesh;//メッシュ ANIMATION Anim;//アニメーションデータ }nde; //階層メッシュクラス class HIERARCHY{ public void Draw();//描画 void Draw_Frame(NODE node,int Frame_Time,MATRIX mat);//フレーム描画 void Animation_Draw(int Animation_NO,int Frame);//アニメーション描画 HIERARCHY(); HIERARCHY(char* FileName,int size); NODE Root;//ルートノード int Size;//サイズ int Animation_MaxFrame;//最大フレーム private bool Load_Hierarchy(char* FileName); //階層メッシュ読み込み void Find_Frame(NODE node,char* name);//フレームを探す bool Load_Frame(FILE fp,NODE node,int hierarchy); //フレーム読み込み bool Load_Mesh(FILE fp,NODE node);//メッシュ読み込み bool Load_Animation(FILE fp);//アニメーション読み込み MATRIX Linear_Interpolation(MATRIX a,MATRIX b,float t);//線形補間 QUATERNION Spherical_Linear_Interpolation( QUATERNION q1, QUATERNION q2, float t);//球面線形補間 void Init(); char buffer[255]; int Back;//階層戻し NODE* pNode;//ノードポインタ }; //コンストラクタ HIERARCHY HIERARCHY(){ Init(); } //コンストラクタ HIERARCHY HIERARCHY(char* FileName,int size){ Init(); Size=size; Load_Hierarchy(FileName); } //初期化 void HIERARCHY Init(){ Root.Node=NULL; Root.Next=NULL; Root.FrameName= Root ; Root.Mesh=NULL; } //球面線形補間 QUATERNION HIERARCHY Spherical_Linear_Interpolation( QUATERNION q1, QUATERNION q2, float t) { QUATERNION q; if((q1.w==q2.w) (q1.x==q2.x) (q1.y==q2.y) (q1.z==q2.z)){ for(int i=0;i 4;i++){ q.Index[i] = q1.Index[i]; } return q; } float qr = q1.w * q2.w + q1.x * q2.x + q1.y * q2.y + q1.z * q2.z; float ss = 1.0f - qr * qr; if (ss == 0.0f) { for(int i=0;i 4;i++){ q.Index[i] = q1.Index[i]; } return q; }else{ float sp = sqrt(ss); float ph = acos(qr); float pt = ph * t; float t1 = sin(pt) / sp; float t0 = sin(ph - pt) / sp; for(int i=0;i 4;i++){ q.Index[i] = (q1.Index[i] * t0 + q2.Index[i] * t1); } return q; } } //線形補間 MATRIX HIERARCHY Linear_Interpolation(MATRIX a,MATRIX b,float t){ MATRIX ret,r1,r2,r3; QUATERNION q1,q2,q3; Vector3f vec_A, vec_B, vec_R; //平行移動 vec_A.x=a._41; vec_A.y=a._42; vec_A.z=a._43; vec_B.x=b._41; vec_B.y=b._42; vec_B.z=b._43; vec_R=vec_A*(1.0f-t) + vec_B*t; ret._41=vec_R.x; ret._42=vec_R.y; ret._43=vec_R.z; //スケーリング成分抜き出し vec_A.x=sqrt(a._11*a._11+a._21*a._21+a._31*a._31); vec_A.y=sqrt(a._12*a._12+a._22*a._22+a._32*a._32); vec_A.z=sqrt(a._13*a._13+a._23*a._23+a._33*a._33); vec_B.x=sqrt(b._11*b._11+b._21*b._21+b._31*b._31); vec_B.y=sqrt(b._12*b._12+b._22*b._22+b._32*b._32); vec_B.z=sqrt(b._13*b._13+b._23*b._23+b._33*b._33); for(int i=0;i 4;i++){ for(int j=0;j 4;j++){ r1.mat_4x4[j][i]=a.mat_4x4[j][i]; r2.mat_4x4[j][i]=b.mat_4x4[j][i]; if(i==0){if(j 3){r1.mat_4x4[j][i]=a.mat_4x4[j][i]/vec_A.x;r2.mat_4x4[j][i]=b.mat_4x4[j][i]/vec_B.x;}} if(i==1){if(j 3){r1.mat_4x4[j][i]=a.mat_4x4[j][i]/vec_A.y;r2.mat_4x4[j][i]=b.mat_4x4[j][i]/vec_B.y;}} if(i==2){if(j 3){r1.mat_4x4[j][i]=a.mat_4x4[j][i]/vec_A.z;r2.mat_4x4[j][i]=b.mat_4x4[j][i]/vec_B.z;}} } } //クォータニオンを補間 q1=r1.ToQuaternion(); q2=r2.ToQuaternion(); q3=Spherical_Linear_Interpolation(q1,q2,t); r3=q3.ToMatrix(); vec_R=vec_A*(1.0f-t) + vec_B*t; ret._11=r3._11*vec_R.x; ret._21=r3._21*vec_R.x; ret._31=r3._31*vec_R.x; ret._12=r3._12*vec_R.y; ret._22=r3._22*vec_R.y; ret._32=r3._32*vec_R.y; ret._13=r3._13*vec_R.z; ret._23=r3._23*vec_R.z; ret._33=r3._33*vec_R.z; return ret; } //フレーム描画 void HIERARCHY Draw_Frame(NODE node,int Frame_Time,MATRIX mat){ MATRIX current=mat; while(1){ if(node.Mesh!=NULL){ glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glPushMatrix(); glMultMatrixf( mat.mat_16[0]); //線形補間 for(int k=1;k (signed)node.Anim.Key.size();k++){ int Length=node.Anim.Key[k]-node.Anim.Key[k-1];//キー間の長さ int Current=Frame_Time-node.Anim.Key[k-1];//キー間の現在位置 float t=(float)Current/(float)Length; if((node.Anim.Key[k-1] =Frame_Time) (node.Anim.Key[k] Frame_Time)){ MATRIX Linear = Linear_Interpolation(node.Anim.Matrix[k-1],node.Anim.Matrix[k],t); mat=mat.Multiplication(Linear); glMultMatrixf( Linear.mat_16[0]); } } for(int i=0;i (signed)node.Mesh- Material.size();i++){ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,(const GLfloat *) node.Mesh- Material[i].MaterialColor.ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,(const GLfloat *) node.Mesh- Material[i].MaterialColor.diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,(const GLfloat *) node.Mesh- Material[i].MaterialColor.specular); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,node.Mesh- Material[i].Shininess); if(node.Mesh- Material[i].TexNo 0){ glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, node.Mesh- TexID[node.Mesh- Material[i].TexNo-1]); }else{ glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } if(node.Mesh- Material[i].Tridata.size() 1){ glVertexPointer(3, GL_FLOAT,sizeof(Tri) , node.Mesh- Material[i].Tridata[0].TriVer.x); glNormalPointer(GL_FLOAT,sizeof(Tri), node.Mesh- Material[i].Tridata[0].TriNor.x); //if(node.Mesh- Material[i].TexNo 0)glTexCoordPointer(2, GL_FLOAT, sizeof(Tri), node.Mesh- Material[i].Tridata[0].TriUV.u); glDrawArrays(GL_TRIANGLES,0,node.Mesh- Material[i].Tridata.size()); } if(node.Mesh- Material[i].Quaddata.size() 1){ glVertexPointer(3, GL_FLOAT,sizeof(Quad) , node.Mesh- Material[i].Quaddata[0].QuadVer.x); glNormalPointer(GL_FLOAT,sizeof(Quad), node.Mesh- Material[i].Quaddata[0].QuadNor.x); //if(node.Mesh- Material[i].TexNo 0)glTexCoordPointer(2, GL_FLOAT, sizeof(Quad), node.Mesh- Material[i].Quaddata[0].QuadUV.u); glDrawArrays(GL_QUADS,0,node.Mesh- Material[i].Quaddata.size()); } } glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); //glDisableClientState(GL_TEXTURE_COORD_ARRAY); //glDisable(GL_TEXTURE_2D); glPopMatrix(); } if(node.Node!=NULL)Draw_Frame(*node.Node,Frame_Time,mat); if(node.Next!=NULL)Draw_Frame(*node.Next,Frame_Time,current); if(node.Node==NULL)return; if(node.Next==NULL)return; return; } } //アニメーション描画 void HIERARCHY Animation_Draw(int Animation_NO,int Frame){ MATRIX mat; Draw_Frame(Root,Frame,mat); } //描画 void HIERARCHY Draw(){ MATRIX mat; Draw_Frame(Root,0,mat); } //フレームを探す void HIERARCHY Find_Frame(NODE node,char* name){ while(1){ if(strcmp(node.FrameName.c_str(),name)==0){ pNode= node; return; } if(node.Node!=NULL)Find_Frame(*node.Node,name); if(node.Next!=NULL)Find_Frame(*node.Next,name); if(node.Node==NULL)return; if(node.Next==NULL)return; return; } return; } //アニメーション読み込み bool HIERARCHY Load_Animation(FILE fp){ char buf[255]; char name[255]; vector QUATERNION Quaternion; vector Vector3f Transform; vector Vector3f Scaling; vector int Key1; vector int Key2; vector int Key3; int hierarchy=0,count=0,keyID,key=0,dummy=0,x=0,y=0,z=0,w=0; //合成行列 MATRIX mix; //読み込み while(!feof( fp)) { ZeroMemory(buf,sizeof(buf)); fscanf_s( fp, %s ,buf,sizeof(buf)); //AnimationSetを探す if(strcmp(buf, AnimationSet )==0){ while(!feof( fp)) { fgets(buf,sizeof(buf), fp); if(strstr(buf, AnimationKey )==NULL){ if((!strstr(buf, { )==NULL) (!strstr(buf, } )==NULL)){//名前の抽出 sscanf_s(buf, { %s } , name,sizeof(name)); pNode=NULL; Find_Frame(Root,name); pNode- Anim.Matrix.resize(Key3.size()); for(int i=0;i (signed)Key3.size();i++){ if(Key1.size()==Key3.size()){ Quaternion[i].y=Quaternion[i].y*-1; Quaternion[i].z=Quaternion[i].z*-1; mix=Quaternion[i].ToMatrix(); } if(Key2.size()==Key3.size()){ mix._11*=Scaling[i].x; mix._21*=Scaling[i].x; mix._31*=Scaling[i].x; mix._12*=Scaling[i].y; mix._22*=Scaling[i].y; mix._32*=Scaling[i].y; mix._13*=Scaling[i].z; mix._23*=Scaling[i].z; mix._33*=Scaling[i].z; } mix._41=Transform[i].x*Size; mix._42=Transform[i].y*Size; mix._43=Transform[i].z*Size; pNode- Anim.Key.push_back(Key3[i]); for(int j=0;j 16;j++)pNode- Anim.Matrix[i].mat_16[j]=mix.mat_16[j]; } Animation_MaxFrame=Key3[Key3.size()-1]; Quaternion.clear(); Scaling.clear(); Transform.clear(); Key1.clear(); Key2.clear(); Key3.clear(); } }else{ fgets(buf,sizeof(buf), fp);//キー 0 回転 , 1 拡大縮小 , 2 平行移動 keyID=atoi(buf); fgets(buf,sizeof(buf), fp);//キーデータの個数 count=atoi(buf); switch (keyID){ case 0 for(int i=0;i count;i++){ fscanf_s( fp, %d;%d;%f,%f,%f,%f;;, , key, dummy, qua.w, qua.x, qua.y, qua.z); Key1.push_back(key); Quaternion.push_back(qua); } break; case 1 for(int i=0;i count;i++){ fscanf_s( fp, %d;%d;%f,%f,%f;;, , key, dummy, vec3d.x, vec3d.y, vec3d.z); Key2.push_back(key); Scaling.push_back(vec3d); } break; case 2 for(int i=0;i count;i++){ fscanf_s( fp, %d;%d;%f,%f,%f;;, , key, dummy, vec3d.x, vec3d.y, vec3d.z); Key3.push_back(key); Transform.push_back(vec3d); } break; default break; } } } } } Animation_MaxFrame=pNode- Anim.Key[pNode- Anim.Key.size()-1]; Quaternion.clear(); Scaling.clear(); Transform.clear(); Key1.clear(); Key2.clear(); Key3.clear(); return true; } //メッシュ読み込み bool HIERARCHY Load_Mesh(FILE fp,NODE node){ vector Vector3f Vertex;//頂点 vector Vector3f Normal;//法線 vector UV uv;//UV vector int VertexIndex; vector int NormalIndex; vector int MaterialIndex; vector int FaceIndex; char key[255]; char buf[255]; int v1=0,v2=0,v3=0,v4=0; int Count=0,Hierarchy=1; string str= ; fscanf_s( fp, %s ,key,sizeof(key)); node.Mesh =new MESH(msh); //読み込み while(!feof( fp)) { //キーワード 読み込み ZeroMemory(key,sizeof(key)); fscanf_s( fp, %s ,key,sizeof(key)); //階層+ if(strcmp(key, { )==0){ Hierarchy++; } //階層- if(strcmp(key, } )==0){ Hierarchy--; if(Hierarchy==0){ Count=0; //マテリアル毎のデータを作成 for(int i=0;i (signed)MaterialIndex.size();i++){ if(FaceIndex[i]==3){ for(int j=0;j 3;j++){ Tri.TriVer=Vertex[VertexIndex[Count+j]]; Tri.TriNor=Normal[NormalIndex[Count+j]]; //Tri.TriUV=uv[VertexIndex[Count+j]]; node.Mesh- Material[MaterialIndex[i]].Tridata.push_back(Tri); } Count+=3; }else{ for(int j=0;j 4;j++){ Quad.QuadVer=Vertex[VertexIndex[Count+j]]; Quad.QuadNor=Normal[NormalIndex[Count+j]]; //Quad.QuadUV=uv[VertexIndex[Count+j]]; node.Mesh- Material[MaterialIndex[i]].Quaddata.push_back(Quad); } Count+=4; } } Vertex.clear(); Normal.clear(); uv.clear(); VertexIndex.clear(); NormalIndex.clear(); MaterialIndex.clear(); FaceIndex.clear(); return true; } } if(strcmp(key, Frame )==0){ Count=0; //マテリアル毎のデータを作成 for(int i=0;i (signed)MaterialIndex.size();i++){ if(FaceIndex[i]==3){ for(int j=0;j 3;j++){ Tri.TriVer=Vertex[VertexIndex[Count+j]]; Tri.TriNor=Normal[NormalIndex[Count+j]]; //Tri.TriUV=uv[VertexIndex[Count+j]]; node.Mesh- Material[MaterialIndex[i]].Tridata.push_back(Tri); } Count+=3; }else{ for(int j=0;j 4;j++){ Quad.QuadVer=Vertex[VertexIndex[Count+j]]; Quad.QuadNor=Normal[NormalIndex[Count+j]]; //Quad.QuadUV=uv[VertexIndex[Count+j]]; node.Mesh- Material[MaterialIndex[i]].Quaddata.push_back(Quad); } Count+=4; } } Vertex.clear(); Normal.clear(); uv.clear(); VertexIndex.clear(); NormalIndex.clear(); MaterialIndex.clear(); FaceIndex.clear(); return true; } //頂点 読み込み if(strcmp(key, Mesh )==0) { Hierarchy++; fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); Count=atoi(buf); for(int i=0;i Count ;i++) { fscanf_s( fp, %f;%f;%f;, , vec3d.x, vec3d.y, vec3d.z); Vertex.push_back(vec3d*(float)Size); } //頂点インデックス読み込み fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); while(strchr(buf, ; )==NULL){fgets(buf,sizeof(buf), fp);}//空行対策 Count=atoi(buf); for(int i=0;i Count ;i++) { int dammy=0; fgets(buf,sizeof(buf), fp); str=buf; string size_type first = str.find_first_not_of( ); string size_type tab = str.find_first_not_of( \t ); string size_type index = str.find( 3; ); if(index-first-tab==0){ sscanf_s(buf, %d;%d,%d,%d;, , dammy, v1, v2, v3); VertexIndex.push_back(v1); VertexIndex.push_back(v2); VertexIndex.push_back(v3); } if(!(index-first-tab==0)){ sscanf_s(buf, %d;%d,%d,%d,%d;, , dammy, v1, v2, v3, v4); VertexIndex.push_back(v1); VertexIndex.push_back(v2); VertexIndex.push_back(v3); VertexIndex.push_back(v4); } FaceIndex.push_back(dammy); } } //法線 読み込み if(strcmp(key, MeshNormals )==0) { Hierarchy++; fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); Count=atoi(buf); for(int i=0;i Count ;i++) { fscanf_s( fp, %f;%f;%f;, , vec3d.x, vec3d.y, vec3d.z); Normal.push_back(vec3d); } //法線インデックス読み込み fgets(buf,sizeof(buf), fp);//データは2行下にあると推定 改行する fgets(buf,sizeof(buf), fp); while(strchr(buf, ; )==NULL){fgets(buf,sizeof(buf), fp);}//空行対策 Count=atoi(buf); for(int i=0;i Count ;i++) { int dammy=0; fgets(buf,sizeof(buf), fp); str=buf; string size_type first = str.find_first_not_of( ); string size_type tab = str.find_first_not_of( \t ); string size_type index = str.find( 3; ); if(index-first-tab==0){ sscanf_s(buf, %d;%d,%d,%d;, , dammy, v1, v2, v3); NormalIndex.push_back(v1); NormalIndex.push_back(v2); NormalIndex.push_back(v3); } if(!(index-first-tab==0)){ sscanf_s(buf, %d;%d,%d,%d,%d;, , dammy, v1, v2, v3, v4); NormalIndex.push_back(v1); NormalIndex.push_back(v2); NormalIndex.push_back(v3); NormalIndex.push_back(v4); } } } //マテリアルリスト if(strcmp(key, MeshMaterialList )==0) { Hierarchy++; fgets(buf,sizeof(buf), fp);//空改行 fgets(buf,sizeof(buf), fp);//マテリアル数 fgets(buf,sizeof(buf), fp);//リスト要素数 Count=atoi(buf); for(int i=0;i Count;i++) { fgets(buf,sizeof(buf), fp); int test=atoi(buf); MaterialIndex.push_back(test); } } //マテリアル読み込み if(strcmp(key, Material )==0) { Hierarchy++; fgets(buf,sizeof(buf), fp);//直後の行にあると推定 改行する //ディフューズ fscanf_s( fp, %f;%f;%f;%f;; , vec4d.x, vec4d.y, vec4d.z, vec4d.w); mtl.MaterialColor.diffuse=(const Color4 )vec4d; //SHININESS fscanf_s( fp, %f; , mtl.Shininess); //スペキュラー fscanf_s( fp, %f;%f;%f;; , vec4d.x, vec4d.y, vec4d.z); mtl.MaterialColor.specular=(const Color4 )vec4d; //エミッシブ fscanf_s( fp, %f;%f;%f;; , vec4d.x, vec4d.y, vec4d.z); mtl.MaterialColor.ambient=(const Color4 )vec4d; node.Mesh- Material.push_back(mtl); } } return false; } //フレーム読み込み bool HIERARCHY Load_Frame(FILE fp,NODE node,int hierarchy){ char key[255]; int begin=0,end=0; int current=hierarchy;//現在の階層 int file_pos; while(!feof( fp)) { //キーワード 読み込み ZeroMemory(key,sizeof(key)); fscanf_s( fp, %s ,key,sizeof(key)); //ヘッダー読み飛ばし if(strcmp(key, Header )==0){ while(strcmp(key, } )){ fscanf_s( fp, %s ,key,sizeof(key)); } continue; } //テンプレート読み飛ばし if(strcmp(key, template )==0){ while(strcmp(key, } )){ fscanf_s( fp, %s ,key,sizeof(key)); } continue; } //階層+ if(strcmp(key, { )==0){ begin++; } //階層- if(strcmp(key, } )==0){ end++; } //フレーム if(strcmp(key, Frame )==0){ fscanf_s( fp, %s ,key,sizeof(key)); if(((begin==0) (end==0))||(end-begin==-1)){//子ノード追加 node.Node=new NODE(nde); node.Node- FrameName=key; file_pos=ftell( fp); Load_Mesh(fp,*node.Node); fseek( fp, file_pos, SEEK_SET ); hierarchy++; Load_Frame(fp,*node.Node,hierarchy);//再帰呼び出し } if(Back==current){//階層戻り先にきた場合、同一階層追加 Back=-1; node.Next=new NODE(nde); node.Next- FrameName=buffer; file_pos=ftell( fp); Load_Mesh(fp,*node.Next); fseek( fp, file_pos, SEEK_SET ); Load_Frame(fp,*node.Next,current);//再帰呼び出し } if(end-begin 0){// } が { より多い時は階層を戻る strcpy_s(buffer,255,key); Back=current-(end-begin); return true; } if((end-begin==0) ((begin!=0) (end!=0))){//同一階層追加 node.Next=new NODE(nde); node.Next- FrameName=key; file_pos=ftell( fp); Load_Mesh(fp,*node.Next); fseek( fp, file_pos, SEEK_SET ); Load_Frame(fp,*node.Next,current);//再帰呼び出し } //階層を戻る if((Back!=-1) (Back current))return true; } } return true; } //階層メッシュ読み込み bool HIERARCHY Load_Hierarchy(char* FileName){ //Xファイルを開いて内容を読み込む Back=-1; int Hierarchy=0; FILE* fp=NULL; fopen_s( fp,FileName, rt ); //読み込み fseek(fp,0,SEEK_SET); Load_Frame(*fp,Root,Hierarchy); fseek(fp,0,SEEK_SET); Load_Animation(*fp); fclose(fp); return true; } main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include xfile.h #include font.h #define WIDTH 640 #define HEIGHT 480 float angle=0.0f; HIERARCHY* hierarchy; GLFONT *font; wstring wstr; wchar_t wchar[255]; int CurrentFrame; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0,0,WIDTH,HEIGHT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, WIDTH/HEIGHT, 0.1, 2000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(-1200.0, 500.0, 100.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //階層アニメーション hierarchy- Animation_Draw(0,CurrentFrame); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); wstr=L 最大フレーム[ ; _itow_s(hierarchy- Animation_MaxFrame,wchar,255,10); wstr+=wchar; wstr+=L ] ; font- DrawStringW(0,16,(wchar_t *)wstr.c_str()); wstr=L 現在のフレーム[ ; _itow_s(CurrentFrame,wchar,255,10); wstr+=wchar; wstr+=L ] ; font- DrawStringW(0,32,(wchar_t *)wstr.c_str()); glutSwapBuffers(); } void idle(void) { if(hierarchy- Animation_MaxFrame CurrentFrame)CurrentFrame=0; Sleep(1); glutPostRedisplay(); } //タイマー void timer(int value) { CurrentFrame+=30; glutTimerFunc(10 , timer , 0); } void Init(){ glClearColor(0.0, 0.0, 0.0, 1.0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); hierarchy = new HIERARCHY( sample4.x ,100); font = new GLFONT(L MS明朝 , 16); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( Xの階層メッシュアニメーション読み込み ); glutDisplayFunc(display); glutIdleFunc(idle); glutTimerFunc(10 , timer , 0); Init(); glutMainLoop(); return 0; }