VPython三维仿真(NO.9)贴图

在Vpython中贴图对象为Texture,帮助文档如下:
https://www.glowscript.org/docs/VPythonDocs/textures.html

box贴图

r=box(size=vector(1000, 1000, 1000),texture='rock_texture.jpg')

在这里插入图片描述

place属性

控制贴图的位置,可接受参数:‘left’、 ‘right’、 ‘sides’ (除了左、右面的其他面)、‘ends’(左面与右面)、 ‘all’ (默认值)。左右面的定义是当VPython对象的轴位于(1,0,0)方向(+x方向)的左右面。对于圆柱体, 'sides’指圆周曲面。以下代码只贴box右侧:

box(color=color.green,texture={'file':textures.stucco,'place':'right'})

在这里插入图片描述

box(color=color.green,texture={'file':'rock_texture.jpg','place':'right'})

在这里插入图片描述

贴图长宽处理

如果贴图的大小(像素数)不是2的n次方,自动将图片长宽拉伸至最接近的2的n次方尺寸。

VPython7贴图路径

贴图必须与程序在同一文件夹,或下一级文件夹中,如:

texture='T.jpg'
texture='images/T.jpg'

VPython安装后,模块的标准贴图位置:
…/ Lib/site-packages/vpython/vpython_data
VPython7先在程序文件夹中寻找贴图文件,然后在vpython_data文件夹中寻找贴图文件。

quad贴图与凹凸贴图

a、b、c、d四个点的pos绕y轴正向环绕,normal如下设置。

a = vertex( pos=vec(500,0,500),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(0,0,0))
b = vertex( pos=vec(500,0,-500),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(1,0,0))
c = vertex( pos=vec(-500,0,-500),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(1,1,0))
d = vertex( pos=vec(-500,0,500),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(0,1,0))
#凹凸贴图,立体效果好
Q = quad( vs=[a,b,c,d],texture=dict(file=textures.stones,bumpmap=bumpmaps.stones))

在这里插入图片描述

#非凹凸贴图,立体效果差
Q = quad( vs=[a,b,c,d],texture=dict(file=textures.stones))

在这里插入图片描述

设置texpos的方法

texpos值作用

texpos为纹理图片四角的坐标(x,y)。纹理图片都是二维图片,所以texpos的赋值只有x,y值,z值为0。x,y值为纹理图片使用的宽度和高度比例,值为0~1。贴图四角的texpos坐标如下图:
在这里插入图片描述

a = vertex( pos=vec(0,0,0),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(0,0,0))
b = vertex( pos=vec(0,0,1000),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(1,0,0))
c = vertex( pos=vec(1000,0,1000),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(1,1,0))
d = vertex( pos=vec(1000,0,0),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(0,1,0))
Q = quad( vs=[a,b,c,d],texture=dict(file=textures.stones,bumpmap=bumpmaps.stones))

以上代码拉伸了贴图,对应以下的贴图大小:
在这里插入图片描述

旋转纹理

以下代码通过texpos赋值改变纹理图片四个角点与quad四个角点的对应次序,将贴图逆时针旋转90度。

a = vertex( pos=vec(0,0,0),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(0,1,0))
b = vertex( pos=vec(0,0,1000),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(0,0,0))
c = vertex( pos=vec(1000,0,1000),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(1,0,0))
d = vertex( pos=vec(1000,0,0),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(1,1,0))
Q = quad( vs=[a,b,c,d],texture='flower_texture.jpg')

以上代码将贴图旋转如下:
在这里插入图片描述

截取部分纹理

以下代码截取纹理右半部分,顺时针旋转90度后拉伸贴图。
在这里插入图片描述
在这里插入图片描述

a = vertex( pos=vec(0,0,0),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(1,0,0))
b = vertex( pos=vec(0,0,1000),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(1,1,0))
c = vertex( pos=vec(1000,0,1000),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(0.5,1,0))
d = vertex( pos=vec(1000,0,0),normal=vector(0,1,0),color=vec(1,1,1),texpos=vec(0.5,0,0))
Q = quad( vs=[a,b,c,d],texture='flower_texture.jpg')

为示例加石头地面

qn=vector(0,1,0)
cr=vec(1,1,1)
ql=50000
a = vertex( pos=vec(ql,0,ql),normal=qn,color=cr,texpos=vec(0,0,0))
b = vertex( pos=vec(ql,0,-ql),normal=qn,color=cr,texpos=vec(1,0,0))
c = vertex( pos=vec(-ql,0,-ql),normal=qn,color=cr,texpos=vec(1,1,0))
d = vertex( pos=vec(-ql,0,ql),normal=qn,color=cr,texpos=vec(0,1,0))
Q = quad( vs=[a,b,c,d],texture=dict(file=textures.stones,bumpmap=bumpmaps.stones))

按以上修改示例代码后,示例的三维动画如以下视频:

贴图加地面

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

合金弹头001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值