Android OpenGLES2.0(十六)——3D模型贴图及光照处理(obj+mtl)

Android OpenGLES2.0(十六)——3D模型贴图及光照处理(obj+mtl),第1张

在Android OpenGLES2.0(十四)——Obj格式3D模型加载中实现了Obj格式的3D模型的加载,加载的是一个没有贴图,没有光照处理的帽子,为了呈现出立体效果,“手动”加了光照,拥有贴图的纹理及光照又该怎么加载呢?

本篇博客例子中加载的是一个卡通形象皮卡丘,资源是在网上随便找的一个。加载出来如图所示:

obj内容格式如下:

mtl文件内容格式如下:

关于Obj的内容格式,在上篇博客中已经做了总结,本篇博客中使用的obj,可以看到f后面的不再跟的是4个数字,而是 f 2/58/58 3/59/59 17/60/60 这种样子的三组数,每一组都表示为顶点坐标索引/贴图坐标点索引/顶点法线索引,三个顶点组成一个三角形。而头部的 mtllib pikachu.mtl 则指明使用的材质库。

而mtl格式文件中,主要数据类型为:

模型加载和之前的模型加载大同小异,不同的是,这次我们需要将模型的贴图坐标、顶点法线也一起加载,并传入到shader中。其他参数,有的自然也要取到。

模型加载以obj文件为入口,解析obj文件,从中获取到mtl文件相对路径,然后解析mtl文件。将材质库拆分为诸多的单一材质。obj对象的 加载,根据具使用材质不同来分解为多个3D模型。具体加载过程如下:

顶点着色器

片元着色器

完成了以上准备工作,就可以调用 readMultiObj 方法,将obj文件读成一个或多个带有各项参数的3D模型类,然后将每一个3D模型的参数传入shader中,进而进行渲染:

Android自带的跑马灯效果不太好控制,不能控制速度,不能即时停止和启动,而且还受焦点的影响蛋疼不已。由于项目需求需要用的可控制性高的跑马灯效果,所以自己写了一个自定义的TextView

  注意:在布局文件引用本view时,paddingLeft,paddingRigh都必须为0dp,需要增加这两个属性的,大家可以自行修改代码。

    android:ellipsize="marquee" android:singleLine="true" 这两个属性也要加上

public class MarqueeText extends TextView implements Runnable {

        private int currentScrollX// 当前滚动的位置

        private boolean isStop = false

        private int textWidth

        private boolean isMeasure = false

        public MarqueeText(C

ontext context) {

                super(context)

                // TODO Auto-generated constructor stub

        }

        public MarqueeText(Context context, AttributeSet attrs) {

                super(context, attrs)

        }

        public MarqueeText(Context context, AttributeSet attrs, int defStyle) {

                super(context, attrs, defStyle)

        }

        @Override

        protected void onDraw(Canvas canvas) {

                // TODO Auto-generated method stub

                super.onDraw(canvas)

                if (!isMeasure) {// 文字宽度只需获取一次就可以了

                        getTextWidth()

                        isMeasure = true

                }

        }

        /**

         * 获取文字宽度

         */

        private void getTextWidth() {

                Paint paint = this.getPaint()

                String str = this.getText().toString()

                textWidth = (int) paint.measureText(str)

        }

        @Override

        public void run() {

                currentScrollX -= 2// 滚动速度

                scrollTo(currentScrollX, 0)

                if (isStop) {

                        return

                }

                if (getScrollX() <= -(this.getWidth())) {

                        scrollTo(textWidth, 0)

                        currentScrollX = textWidth

//                        return

                }

                postDelayed(this, 5)

        }

        // 开始滚动

        public void startScroll() {

                isStop = false

                this.removeCallbacks(this)

                post(this)

        }

        // 停止滚动

        public void stopScroll() {

                isStop = true

        }

        // 从头开始滚动

        public void startFor0() {

            currentScrollX = 0

            startScroll()

        }

}布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

    <Button

        android:id="@+id/start"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:onClick="start"

        android:text="走起" />

 <Button        android:id="@+id/stop"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="stop"        android:text="停止" />    <Button        android:id="@+id/startfor0"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="startFor0"        android:text="从头开始" />    <simtice.demo.marqueetext.MarqueeText        android:id="@+id/test"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:background="#339320"        android:ellipsize="marquee"        android:singleLine="true"        android:text="这才是真正的文字跑马灯效果这才是真正的字跑马灯效果这才是真正的"        android:textColor="#000000"        android:textSize="20dp" >    </simtice.demo.marqueetext.MarqueeText></LinearLayout>MainActivitypublic class MainActivity extends Activity {        private MarqueeText test        @Override        public void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState)                setContentView(R.layout.activity_main)                test = (MarqueeText) this.findViewById(R.id.test)        }        public void start(View v) {                test.startScroll()        }        public void stop(View v) {                test.stopScroll()        }        public void startFor0(View v){                test.startFor0()        }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11684455.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存