qb64中的3d例子
qbasic吧
全部回复
仅看楼主
level 5
白芦花 楼主
有没有人研究3b的
2018年01月27日 01点01分 1
level 5
白芦花 楼主
第二个例子
2018年01月27日 01点01分 2
level 5
白芦花 楼主
CHDIR "programs\samples\open_gl" '进入当前目录
DIM SHARED AllowSubGL ' =0 时 SUB _GL 不运行
TYPE DONT_USE_GLH_Handle_TYPE
in_use AS _BYTE
handle AS LONG
END TYPE
REDIM SHARED DONT_USE_GLH_Handle(1000) AS DONT_USE_GLH_Handle_TYPE
SCREEN _NEWIMAGE(1024, 768, 32)
backdrop = _LOADIMAGE("xcom_backdrop.jpg") '背景
_PUTIMAGE , backdrop
_FREEIMAGE backdrop
_DONTBLEND
LINE (200, 200)-(500, 500), _RGBA(0, 255, 255, 0), BF '创建一个视窗(按1)
_BLEND
AllowSubGL = 1
DO
'这是我们的程序的主循环
_LIMIT 100
LOCATE 1, 1
c = c + 1: PRINT "Mainloop has done nothing"; c; "times" '主循环运行了多少次
PRINT "Press 1[GL behind], 2[GL on top] or 3[GL only, good for speed] to switch rendering order."
' 按 1[GL 在后面],2[GL 在顶层] 或 3[GL 唯一,速度快] 切换渲染秩序良好。
k$ = INKEY$
IF k$ = "1" THEN _GLRENDER _BEHIND
IF k$ = "2" THEN _GLRENDER _ONTOP
IF k$ = "3" THEN _GLRENDER _ONLY
LOOP UNTIL k$ = CHR$(27)
END
'这是特别命名的过程 "_GL" 它检测qb64对OpenGL命令支持
'它是自动调用的(被),当底层软件认为可更新的时候,
'通常/理想情况下,与您的显示器的刷新率同步
SUB _GL STATIC
'上面使用的是静态的,使在这个过程中的所有变量保持它们的调用之间的值
IF AllowSubGL = 0 THEN EXIT SUB '还没准备好!
'时间就是一切,我们不知道3d渲染器如何快速的调用此过程,我们使用计时器来处理流畅运行问题
T# = TIMER(0.001)
IF ETT# = 0 THEN ETT
# = T#

ET
# = T#
- ETT#
ETT
# = T#

IF sub_gl_called = 0 THEN
sub_gl_called = 1 '我们只需要执行一次下面的代码
i = _LOADIMAGE("xcom256.png", 32)
mytex = GLH_Image_to_Texture(i) '此辅助函数将图像转换为纹理
_FREEIMAGE i
END IF
'这些设置会影响 OpenGL 渲染内容
'!!! 这些设置让 Alpha 显示如何工作,但当 Alpha 选项被禁用时,将快10倍!!!
'***每个设置必须重置,因为自从上次运行后,不能保证设置没有改变***
_glMatrixMode _GL_PROJECTION '选择投影矩阵
_glLoadIdentity '重置投影矩阵
'设置视景体 视野,宽高比, 近裁面(距离), 远裁面(距离)
_gluPerspective 45, _WIDTH(0) / _HEIGHT(0), 1, 100 '为了方便起见,QB64内部支持此GLU命令,但不支持GLU
_glEnable _GL_TEXTURE_2D
_glEnable _GL_BLEND
_glBlendFunc _GL_SRC_ALPHA, _GL_ONE_MINUS_SRC_ALPHA '如何解释α值
_glEnable _GL_DEPTH_TEST '使用 Z 轴缓冲
_glDepthMask _GL_TRUE
_glAlphaFunc _GL_GREATER, 0.5 '不要做任何事情,如果阿尔法不大于0.5(或128)
_glEnable _GL_ALPHA_TEST
_glTexParameteri _GL_TEXTURE_2D, _GL_TEXTURE_MAG_FILTER, _GL_LINEAR
_glTexParameteri _GL_TEXTURE_2D, _GL_TEXTURE_MIN_FILTER, _GL_LINEAR
'**************************************************************************************************************
GLH_Select_Texture mytex
_glMatrixMode _GL_MODELVIEW '选择模型观察矩阵
_glLoadIdentity '重置模型观察矩阵
_glTranslatef 0, 0, -10 '转化为屏幕
_glRotatef rotation1, 0, 1, 0 '自旋,自旋,自旋…
_glRotatef rotation2, 1, 0, 0
_glBegin _GL_QUADS '我们将绘制矩形(四边形)
_glTexCoord2f 0, 0: _glVertex3f 0, 0, 4 '顶点在空间中的位置和纹理位置
_glTexCoord2f 1, 0: _glVertex3f 5, 0, 4
_glTexCoord2f 1, 1: _glVertex3f 5, -5, 4
_glTexCoord2f 0, 1: _glVertex3f 0, -5, 4
_glEnd
RANDOMIZE USING 1 '每次生成相同的随机数集
_glBegin _GL_TRIANGLES 'PNG(几乎)仅消耗其矩形三角区
FOR t = 1 TO 10
_glTexCoord2f 0, 0: _glVertex3f RND * 6 - 3, RND * 6 - 3, RND * 6 - 3
_glTexCoord2f 1, 0: _glVertex3f RND * 6 - 3, RND * 6 - 3, RND * 6 - 3
_glTexCoord2f 0.5, 1: _glVertex3f RND * 6 - 3, RND * 6 - 3, RND * 6 - 3
NEXT
_glEnd
rotation1 = rotation1 + 100 * ET#
rotation2 = rotation2 + 200 * ET#
END SUB
'qb64 open-gl 辅助宏(又名 GLH 宏)
SUB GLH_Select_Texture (texture_handle AS LONG) '将图像句柄转换为纹理句柄
IF texture_handle < 1 OR texture_handle > UBOUND(DONT_USE_GLH_HANDLE) THEN ERROR 258: EXIT FUNCTION
IF DONT_USE_GLH_Handle(texture_handle).in_use = 0 THEN ERROR 258: EXIT FUNCTION
_glBindTexture _GL_TEXTURE_2D, DONT_USE_GLH_Handle(texture_handle).handle
END SUB
FUNCTION GLH_Image_to_Texture (image_handle AS LONG) '将图像句柄转换为纹理句柄
IF image_handle >= 0 THEN ERROR 258: EXIT FUNCTION '不允许屏幕页面
DIM m AS _MEM
m = _MEMIMAGE(image_handle)
DIM h AS LONG
h = DONT_USE_GLH_New_Texture_Handle
GLH_Image_to_Texture = h
_glBindTexture _GL_TEXTURE_2D, DONT_USE_GLH_Handle(h).handle
_glTexImage2D _GL_TEXTURE_2D, 0, _GL_RGBA, _WIDTH(image_handle), _HEIGHT(image_handle), 0, &H80E1&&, _GL_UNSIGNED_BYTE, m.OFFSET
_MEMFREE m
END FUNCTION
FUNCTION DONT_USE_GLH_New_Texture_Handle
handle&& = 0
_glGenTextures 1, _OFFSET(handle&&)
DONT_USE_GLH_New_Texture_Handle = handle&&
FOR h = 1 TO UBOUND(DONT_USE_GLH_Handle)
IF DONT_USE_GLH_Handle(h).in_use = 0 THEN
DONT_USE_GLH_Handle(h).in_use = 1
DONT_USE_GLH_Handle(h).handle = handle&&
DONT_USE_GLH_New_Texture_Handle = h
EXIT FUNCTION
END IF
NEXT
REDIM _PRESERVE DONT_USE_GLH_Handle(UBOUND(DONT_USE_GLH_HANDLE) * 2) AS DONT_USE_GLH_Handle_TYPE
DONT_USE_GLH_Handle(h).in_use = 1
DONT_USE_GLH_Handle(h).handle = handle&&
DONT_USE_GLH_New_Texture_Handle = h
END FUNCTION
2018年01月29日 05点01分 3
level 1
大师,请教一下,这个三维建模后,周围是空的,有解决方法吗?
2018年03月23日 01点03分 5
周围是空的,不懂你的意思
2018年03月23日 10点03分
level 1
就图中的模型四周的一些该有的没有了,不见了。
2018年03月23日 12点03分 6
是视野太小看不见?还是哪个面(网格)开关没打开?
2018年03月23日 13点03分
@白芦花 这个不清楚,就是重建之后,四周的就不见了。能知道是什么原因吗?还是我照相时出了差错,或者说对照相有什么要求吗?光照度、焦距及人与物距离等原因?
2018年03月23日 13点03分
level 1
这个不清楚,就是重建之后,四周的就不见了。
2018年03月23日 13点03分 7
level 1
能知道是什么原因吗?还是我照相时出了差错,或者说对照相有什么要求吗?光照度、焦距及人与物距离等原因?
2018年03月23日 13点03分 8
把照片放几张上来看看
2018年03月23日 13点03分
@白芦花 好的,稍等
2018年03月23日 14点03分
level 1
这是其中几张。
2018年03月23日 14点03分 9
level 1
还有几张
2018年03月23日 14点03分 10
就一块石头,哪张纸上也没有纹理,要不,把纸换成有花纹的画,报纸什么的
2018年03月23日 15点03分
@白芦花 那可以吗,主要是对石头重建阿,那张纸有影响吗?
2018年03月23日 15点03分
@登峰造杰 石头不是出来了吗,你说的周围不是纸吗?如果石头的哪部分没出来,就靠近点多拍几张
2018年03月23日 16点03分
@白芦花 我说的意思是石头四面不见了。跟纸没关系(=^▽^=)
2018年03月24日 00点03分
level 1
如图所示
2018年03月26日 07点03分 11
level 1
它进行了一个多小时,还是这鬼样子。请教,是什么原因?
2018年03月26日 07点03分 12
等结束了再看吧
2018年03月26日 09点03分
@白芦花 图多了总要慢一点
2018年03月26日 09点03分
@白芦花 其实不多阿,也就30张左右。
2018年03月26日 09点03分
level 1
楼主,再请教一下,重建完成后,如何导出呢?我导出来的都打不开。是哪出错了-_-||图示为导出格式以及打开出错图。
2018年03月27日 08点03分 13
在菜单中导入,或者不要放在中文路径的文件夹中
2018年03月27日 09点03分
@白芦花 是那个File -Export Mesh As ...对不٩(๑^o^๑)۶,那要以什么格式导出呢?obj还是别的?
2018年03月27日 09点03分
@白芦花 导出非导入
2018年03月27日 09点03分
@登峰造杰 和导出没关系,打不开是更路径名有关系
2018年03月27日 11点03分
level 1
就是已经建模好了,我怎么保存下来,以便以后查看。怎么导出。请教一下,谢谢了。
2018年03月27日 09点03分 14
换个地方放
2018年03月27日 11点03分
@白芦花 以什么格式呢?obj?还是别的什么(゚o゚;
2018年03月27日 13点03分
@登峰造杰 都可以
2018年03月27日 16点03分
1