|
|
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
ご回答ありがとうございます。
確かにこれなら三角形が作れますのでそれの方は問題ないのですが、
正十二面体は面の一つが五角形ですので、この方法では作れないような気がします。
引き続き、回答を募集します。
|
|
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 "何かおかしいなぁ...。"
| |
|
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
| |
|