HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0807
夏のストーブd3moduleでテクスチャ付き正多面体は作れるか5解決


夏のストーブ

リンク

2014/8/7(Thu) 05:58:44|NO.63513

正六面体は、全て正方形なのでd3texture命令で全く問題なく出来ますが、
正四面体、正八面体、正十二面体、正二十面体は
d3texture命令が実質四角形しか描けないことが問題で実装に躓いています。

頂点を2つ同じものを指定することで三角形は描けますので、
まっさらな正多面体は作れますが、テクスチャをつけようとした場合、
gsquare命令の仕様によりテクスチャが歪むという問題が発生します。
(見る角度に依って歪むのは当然ですが正面から見た時に既に歪んでしまうのを避けたい)
例えば

#const TEX_SIZE 256 buffer 2, TEX_SIZE, TEX_SIZE, 0 cls 1 font msmincho, TEX_SIZE color 10,10,10 mes "あ" screen 0 ax=128,128,256,0 ay=0,0,256,256 cx=0,256,256,0 cy=0,0,256,256 gmode 2 gsquare 2,ax,ay,cx,cy
として実行すると「あ」の上の部分が先鋭化しているのが容易に理解できると思います。

d3moduleのみで実装することは譲れませんが、他の手段があるならそれに従います。
何か方法はないでしょうか?



この記事に返信する


あり

リンク

2014/8/7(Thu) 10:52:37|NO.63515

こういう事ですか?

#const TEX_SIZE 180 // 三角形内に収まる様文字位置を調整 screen 1 : title "テクスチャの元画像" cls 1 color 255 ; コピー範囲の三角形を表示 line 128, 0, 0, 256 line 256, 256, 0, 256 line 256, 256, 128, 0 font msmincho, TEX_SIZE color 10,10,10 pos 46, 70 mes "あ" // 三角形を四角形に変形コピー screen 2 : title "使用するテクスチャ" cx=128,128,256,0 cy=0,0,256,256 ax=0,256,256,0 ay=0,0,256,256 gmode 2 gsquare 1,ax,ay,cx,cy // 三角形に変形コピー screen 0 : title "実際の表示結果" ax=128,128,256,0 ay=0,0,256,256 cx=0,256,256,0 cy=0,0,256,256 gmode 2 gsquare 2,ax,ay,cx,cy



夏のストーブ

リンク

2014/8/7(Thu) 12:09:47|NO.63519

ご回答ありがとうございます。

確かにこれなら三角形が作れますのでそれの方は問題ないのですが、
正十二面体は面の一つが五角形ですので、この方法では作れないような気がします。

引き続き、回答を募集します。



FunnyMaker

リンク

2014/8/7(Thu) 16:21:00|NO.63523

正多角形なら三角形分割で.....。
と思って考えてみましたが、どうも上手くいかず失敗。(計算ミスがあるのだろうか...?)

一応何かの手がかりになるかと思い、投稿します。


*define #define SIZE_TEXTURE 256 #define NUM_VERTEX 6 COLOR_GUID = 255,0,0 COLOR_CHAR = 0,0,255 #define FONTSIZE 200 *calc #define RADIUS SIZE_TEXTURE/2 div_θ = m_pi*2/NUM_VERTEX ln_side_polygon = sin(div_θ/2)*RADIUS*2 ;正多角形の一辺の長さ height_triange = cos(div_θ/2)*RADIUS ;分割された二等辺三角形の高さ。多角形中心より各辺におろした垂線の長さ。 *mkwindow screen 1,SIZE_TEXTURE,SIZE_TEXTURE,0 : title "元画像" screen 2,ln_side_polygon*NUM_VERTEX,height_triange,0 : title "使用するテクスチャ" screen 0,SIZE_TEXTURE,SIZE_TEXTURE,0 : title "復元" *draw ;< 元画像 > gsel 1,0 color 0,0,0 : boxf color COLOR_GUID(0),COLOR_GUID(1),COLOR_GUID(2) pos 2.0*RADIUS ,1.0*RADIUS repeat NUM_VERTEX ,1 line (1.0+cos(div_θ*cnt))*RADIUS ,(1.0+sin(div_θ*cnt))*RADIUS loop font msmincho,200 color COLOR_CHAR(0),COLOR_CHAR(1),COLOR_CHAR(2) pos (SIZE_TEXTURE-FONTSIZE)/2,(SIZE_TEXTURE-FONTSIZE)/2 : mes "あ" color 0,255,0 : circle RADIUS-20,RADIUS-20, RADIUS+20,RADIUS+20 ,0 color 0,255,0 : circle RADIUS-40,RADIUS-40, RADIUS+40,RADIUS+40 ,0 ;< 使用するテクスチャ > gsel 2,0 yArray_dst = 0,0 ,int(height_triange),int(height_triange) repeat NUM_VERTEX IntTmpVal1 = int(ln_side_polygon)*cnt xArray_dst = IntTmpVal1, IntTmpVal1 + ln_side_polygon, IntTmpVal1 + ln_side_polygon, IntTmpVal1 xArray_src = int((1.0+cos(div_θ*cnt))*RADIUS), int((1.0+cos(div_θ*(cnt+1)))*RADIUS), RADIUS, RADIUS yArray_src = int((1.0+sin(div_θ*cnt))*RADIUS), int((1.0+sin(div_θ*(cnt+1)))*RADIUS), RADIUS, RADIUS gsquare 1,xArray_dst,yArray_dst ,xArray_src,yArray_src loop ;< 復元 > gsel 0,0 color 0,0,0 : boxf yArray_src = 0,0 ,int(height_triange),int(height_triange) repeat NUM_VERTEX xArray_dst = int((1.0+cos(div_θ*cnt))*RADIUS), int((1.0+cos(div_θ*(cnt+1)))*RADIUS) ,RADIUS, RADIUS yArray_dst = int((1.0+sin(div_θ*cnt))*RADIUS), int((1.0+sin(div_θ*(cnt+1)))*RADIUS) ,RADIUS, RADIUS IntTmpVal1 = int(ln_side_polygon)*cnt xArray_src = IntTmpVal1, IntTmpVal1 + ln_side_polygon, IntTmpVal1 + ln_side_polygon, IntTmpVal1 gsquare 2,xArray_dst,yArray_dst ,xArray_src,yArray_src loop font msmincho,20 color 255,255,255 pos 0,SIZE_TEXTURE-20 : mes "何かおかしいなぁ...。"



FunnyMaker

リンク

2014/8/7(Thu) 16:34:44|NO.63524

失礼しました。正十二面体の場合は↑のVERTEXを5としてください。



夏のストーブ

リンク

2014/8/8(Fri) 03:25:05|NO.63558

「正多角形なら三角形分割で」という言葉がヒントになって、実装できました。
五角形のみのスクリプトなので汎用性は薄いですが、目的は達成したのでこれで解決とします。


#const FONT_PENT_SIZE 200 #const TEX_SIZE 256 #define TEX_SIZED double(TEX_SIZE) #define COS36 cos(0.2*M_PI) #define TAN36 tan(0.2*M_PI) #define TAN72 tan(0.4*M_PI) #define SIN72 sin(0.4*M_PI) #define PENT_AX TEX_SIZE/2 #define PENT_AY int(TEX_SIZED-TEX_SIZED*SIN72) #define PENT_BX 0 #define PENT_BY int(TEX_SIZED/2.0*TAN36+PENT_AY) #define PENT_CX int(TEX_SIZED/2.0-TEX_SIZED/4.0/COS36) #define PENT_CY TEX_SIZE #define PENT_DX int(TEX_SIZED/2.0+TEX_SIZED/4.0/COS36) #define PENT_DY TEX_SIZE #define PENT_EX TEX_SIZE #define PENT_EY PENT_BY #define PENT_FX TEX_SIZE/2 #define PENT_FY TEX_SIZE // 五角形内に収まる様文字位置を調整 screen 1 : title "テクスチャの元画像" cls 1 color 255 ; コピー範囲の三角形を表示 line PENT_AX,PENT_AY,PENT_BX,PENT_BY line PENT_BX,PENT_BY,PENT_CX,PENT_CY line PENT_CX,PENT_CY,PENT_DX,PENT_DY line PENT_DX,PENT_DY,PENT_EX,PENT_EY line PENT_EX,PENT_EY,PENT_AX,PENT_AY font msmincho, FONT_PENT_SIZE color 10,10,10 pos 28, 55 mes "あ" // 五角形を四角形2つに分割・変形コピー screen 2 : title "使用するテクスチャ1" cx=PENT_AX,PENT_FX,PENT_CX,PENT_BX cy=PENT_AY,PENT_FY,PENT_CY,PENT_BY ax=0,TEX_SIZE,TEX_SIZE,0 ay=0,0,TEX_SIZE,TEX_SIZE gmode 2 gsquare 1,ax,ay,cx,cy screen 3 : title "使用するテクスチャ2" cx=PENT_AX,PENT_EX,PENT_DX,PENT_FX cy=PENT_AY,PENT_EY,PENT_DY,PENT_FY ax=0,TEX_SIZE,TEX_SIZE,0 ay=0,0,TEX_SIZE,TEX_SIZE gmode 2 gsquare 1,ax,ay,cx,cy // 元の形に変形コピー screen 0 : title "実際の表示結果" ax=PENT_AX,PENT_FX,PENT_CX,PENT_BX ay=PENT_AY,PENT_FY,PENT_CY,PENT_BY cx=0,TEX_SIZE,TEX_SIZE,0 cy=0,0,TEX_SIZE,TEX_SIZE gmode 2 gsquare 2,ax,ay,cx,cy ax=PENT_AX,PENT_EX,PENT_DX,PENT_FX ay=PENT_AY,PENT_EY,PENT_DY,PENT_FY cx=0,TEX_SIZE,TEX_SIZE,0 cy=0,0,TEX_SIZE,TEX_SIZE gmode 2 gsquare 3,ax,ay,cx,cy



ONION software Copyright 1997-2023(c) All rights reserved.