Opengl ES 1.x NDK实例开发之四:立方体的旋转

Opengl ES 1.x NDK实例开发之一:搭建开发框架 大家好,我是无敌兔,从这一章开始 阅读详情

开发框架介绍请参见:Opengl ES NDK实例开发之一:搭建开发框架

【实例讲解】


本章在第三章的基础上讲解如何绘制立方体并按照各自的中心进行旋转

绘制立方体实际上是绘制立方体的各个面,其中金字塔包括三个三角形侧面和一个正方形底面,

因为opengl ES里面不支持直接绘制正方形,所以需要将正方形拆分为两个三角形,

因此金字塔总共需要绘制5个三角形

立方体总共有8个顶点,我们在这里采用顶点索引的方式进行绘制

索引里面的值表示顶点的序号

两个立方体按照各自的中心进行旋转,关键代码如下

// 重置当前的模型观察矩阵
	glLoadIdentity();

【实例源码】

[GLJNIActivity.java]

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2.  * Copyright (C) 2007 The Android Open Source Project 
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  * 
  8.  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  *  
  16.  * author: mnorst@foxmail.com 
  17.  */  
  18.   
  19. package com.android.gljni;  
  20.   
  21. import com.android.gljni.GLJNIView;  
  22.   
  23. import android.app.Activity;  
  24. import android.os.Bundle;  
  25.   
  26. public class GLJNIActivity extends Activity {  
  27.     GLJNIView mView;  
  28.   
  29.     @Override  
  30.     protected void onCreate(Bundle icicle) {  
  31.         super.onCreate(icicle);  
  32.         mView = new GLJNIView(getApplication());  
  33.         setContentView(mView);  
  34.     }  
  35.   
  36.     @Override  
  37.     protected void onPause() {  
  38.         super.onPause();  
  39.         mView.onPause();  
  40.     }  
  41.   
  42.     @Override  
  43.     protected void onResume() {  
  44.         super.onResume();  
  45.         mView.onResume();  
  46.     }  
  47. }  
[GLJNIView.java]

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2.  * Copyright (C) 2007 The Android Open Source Project 
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  * 
  8.  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  *  
  16.  * author: mnorst@foxmail.com 
  17.  */  
  18.   
  19. package com.android.gljni;  
  20.   
  21. import javax.microedition.khronos.egl.EGLConfig;  
  22. import javax.microedition.khronos.opengles.GL10;  
  23.   
  24. import com.android.gljni.GLJNILib;  
  25.   
  26. import android.content.Context;  
  27. import android.opengl.GLSurfaceView;  
  28.   
  29. /** 
  30.  * A simple GLSurfaceView sub-class that demonstrate how to perform 
  31.  * OpenGL ES 1.x rendering into a GL Surface. 
  32.  */  
  33. public class GLJNIView extends GLSurfaceView {  
  34.   
  35.     private static final String LOG_TAG = GLJNIView.class.getSimpleName();  
  36.   
  37.     private Renderer renderer;  
  38.   
  39.     public GLJNIView(Context context) {  
  40.         super(context);  
  41.   
  42.         // setEGLConfigChooser会对fps产生影响  
  43.         setEGLConfigChooser(8, 8, 8, 8, 16, 0);  
  44.   
  45.         renderer = new Renderer(context);  
  46.         setRenderer(renderer);  
  47.     }  
  48.   
  49.     private static class Renderer implements GLSurfaceView.Renderer {  
  50.   
  51.         public Renderer(Context ctx) {  
  52.   
  53.         }  
  54.   
  55.         public void onDrawFrame(GL10 gl) {  
  56.             GLJNILib.step();  
  57.         }  
  58.   
  59.         public void onSurfaceChanged(GL10 gl, int width, int height) {  
  60.             GLJNILib.resize(width, height);  
  61.         }  
  62.   
  63.         public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  64.             GLJNILib.init();  
  65.         }  
  66.     }  
  67.   
  68. }  
[GLJNILib.java]

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2.  * Copyright (C) 2007 The Android Open Source Project 
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  * 
  8.  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  *  
  16.  * author: mnorst@foxmail.com 
  17.  */  
  18.   
  19. package com.android.gljni;  
  20.   
  21. //Wrapper for native library  
  22. public class GLJNILib {  
  23.       
  24.     static {  
  25.         System.loadLibrary("gljni");  
  26.     }  
  27.   
  28.     /** 
  29.      * @param width the current view width 
  30.      * @param height the current view height 
  31.      */  
  32.     public static native void resize(int width, int height);   
  33.       
  34.     public static native void step();    
  35.       
  36.     public static native void init();    
  37. }  
[ [gl_code.cpp ]

/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * author: 	mnorst@foxmail.com
 * created:	2014/10/13
 * purpose:	旋转的立方体
 */

// OpenGL ES 1.x code

#include <jni.h>
#include <android/log.h>

#include <GLES/gl.h>
#include <GLES/glext.h>

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/************************************************************************/
/*                             定义                                     */
/************************************************************************/

#define  LOG_TAG    "libgljni"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

// 定义π
const GLfloat PI = 3.1415f;

// 旋转角度
static GLfloat gAngle = 0.0f; 

// 金字塔顶点数组
const GLfloat gVertices[] = {

	// 底面:地面为正方形,拆分为两个三角形
	-1.0f,-1.0f,1.0f,
	1.0f,-1.0f,1.0f,
	1.0f,-1.0f, -1.0f,

	1.0f,-1.0f,-1.0f,
	-1.0f,-1.0f,-1.0f,
	-1.0f,-1.0f,1.0f,

	// 侧面:侧面为4个三角形
	0.0f, 1.0f, 0.0f,
	-1.0f,-1.0f, 1.0f,
	1.0f,-1.0f, 1.0f,

	0.0f, 1.0f, 0.0f,
	1.0f,-1.0f, 1.0f,
	1.0f,-1.0f, -1.0f,

	0.0f, 1.0f, 0.0f,
	1.0f,-1.0f, -1.0f,
	-1.0f,-1.0f, -1.0f,

	0.0f, 1.0f, 0.0f,
	-1.0f,-1.0f,-1.0f,
	-1.0f,-1.0f, 1.0f
};
// 金字塔颜色数组
const GLfloat gColors[] = {
	1.0f,0.0f,0.0f, 1.0f,
	1.0f,0.0f,0.0f, 1.0f,
	1.0f,0.0f,0.0f, 1.0f,

	1.0f,0.0f,0.0f, 1.0f,
	1.0f,0.0f,0.0f, 1.0f,
	1.0f,0.0f,0.0f, 1.0f,

	1.0f,0.0f,0.0f, 1.0f,
	0.0f,1.0f,0.0f, 1.0f,
	0.0f,0.0f,1.0f, 1.0f,

	1.0f,0.0f,0.0f, 1.0f,
	0.0f,0.0f,1.0f, 1.0f,
	0.0f,1.0f,0.0f, 1.0f,

	1.0f,0.0f,0.0f, 1.0f,
	0.0f,0.0f,1.0f, 1.0f,
	0.0f,1.0f,0.0f, 1.0f,

	1.0f,0.0f,0.0f, 1.0f,
	0.0f,0.0f,1.0f, 1.0f,
	0.0f,1.0f,0.0f, 1.0f,
};


// 立方体顶点数组
#define col 1.0f
#define pos 1.0f

static GLfloat gVerticesSquare[] = {
	-pos,-pos,-pos,	/*0*/
	-pos,-pos,pos,	/*1*/
	pos,-pos,pos,	/*2*/
	pos,-pos,-pos,	/*3*/
	-pos,pos,-pos,	/*4*/
	-pos,pos,pos,	/*5*/
	pos,pos,pos,	/*6*/
	pos,pos,-pos,	/*7*/
};
// 立方体顶点索引
static GLubyte gIndexSquare[] = {
	0,2,1,	0,3,2,
	5,1,6,	6,1,2,
	6,2,7,	7,2,3,
	0,4,3,	4,7,3,
	4,0,1,	4,1,5,
	4,5,6,	4,6,7,
};
// 立方体颜色数组
static GLfloat gColorsSquare[] = {
	col,0,0,col,
	0,col,0,col,
	0,0,col,col,
	col,col,0,col,
	col,0,col,col,
	0,col,col,col,
	0,0,0,col,
	col,col,col,col,
};


/************************************************************************/
/*                             C++代码                                  */
/************************************************************************/

static void printGLString(const char *name, GLenum s) {
	const char *v = (const char *) glGetString(s);
	LOGI("GL %s = %s\n", name, v);
}

static void checkGlError(const char* op) {
	for (GLint error = glGetError(); error; error
		= glGetError()) {
			LOGI("after %s() glError (0x%x)\n", op, error);
	}
}

bool init() {
	printGLString("Version", GL_VERSION);
	printGLString("Vendor", GL_VENDOR);
	printGLString("Renderer", GL_RENDERER);
	printGLString("Extensions", GL_EXTENSIONS);

	// 启用阴影平滑
	glShadeModel(GL_SMOOTH);

	// 黑色背景	
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);	

	// 设置深度缓存	
	glClearDepthf(1.0f);

	// 启用深度测试
	glEnable(GL_DEPTH_TEST);	

	// 所作深度测试的类型	
	glDepthFunc(GL_LEQUAL);	

	// 对透视进行修正	
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	

	return true;
}

static void _gluPerspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar)
{
	GLfloat top = zNear * ((GLfloat) tan(fovy * PI / 360.0));
	GLfloat bottom = -top;
	GLfloat left = bottom * aspect;
	GLfloat right = top * aspect;
	glFrustumf(left, right, bottom, top, zNear, zFar);
}

void resize(int width, int height)
{
	// 防止被零除
	if (height==0)								
	{
		height=1;
	}

	// 重置当前的视口
	glViewport(0, 0, width, height);	
	// 选择投影矩阵	
	glMatrixMode(GL_PROJECTION);	
	// 重置投影矩阵	
	glLoadIdentity();							

	// 设置视口的大小
	_gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

	// 选择模型观察矩阵
	glMatrixMode(GL_MODELVIEW);	

	// 重置模型观察矩阵
	glLoadIdentity();							
}

void renderFrame() {
	// 清除屏幕及深度缓存
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
	// 设置背景颜色为黑色
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	// 重置当前的模型观察矩阵
	glLoadIdentity();		
	
	// 启用顶点数组
	glEnableClientState(GL_VERTEX_ARRAY);
	// 启用颜色数组
	glEnableClientState(GL_COLOR_ARRAY);				
	
	// 移入屏幕,便于图形显示
	glTranslatef(0.0f,2.0f,-10.0f);

	// 绘制金字塔
	glRotatef(gAngle,0.0f,1.0f,0.0f);
	glRotatef(gAngle,1.0f,0.0f,0.0f);
	glColorPointer(4, GL_FLOAT, 0, gColors);
	glVertexPointer(3, GL_FLOAT, 0, gVertices);
	glDrawArrays(GL_TRIANGLES, 0, 20);
	
	// 绘制立方形
	// 重置当前的模型观察矩阵
	glLoadIdentity();
	glTranslatef(0.0f, -2.0f,-10.0f);
	glRotatef(gAngle,0.0f,1.0f,0.0f);
	glRotatef(gAngle,1.0f,0.0f,0.0f);
	glVertexPointer(3,GL_FLOAT,0,gVerticesSquare);
	glColorPointer(4,GL_FLOAT,0,gColorsSquare);
	glDrawElements(GL_TRIANGLES,36,GL_UNSIGNED_BYTE,gIndexSquare);
	
	// 关闭顶点数组
	glDisableClientState(GL_VERTEX_ARRAY);
	// 关闭颜色数组
	glDisableClientState(GL_COLOR_ARRAY);				

	// 增加旋转角度
	gAngle += 2.0f;
}

/************************************************************************/
/*                          JNI代码                                     */
/************************************************************************/

extern "C" {
	JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_resize(JNIEnv * env, jobject obj,  jint width, jint height);
	JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_step(JNIEnv * env, jobject obj);
	JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_init(JNIEnv * env, jobject obj);
};

JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_resize(JNIEnv * env, jobject obj,  jint width, jint height)
{
	resize(width, height);
}

JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_step(JNIEnv * env, jobject obj)
{
	renderFrame();
}

JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_init(JNIEnv * env, jobject obj)
{
	init();
}



Opengl ES 1.x NDK实例开发之五:顶点缓存VBO 本章在上一章的基础上讲解顶点缓存数组(Vertex Buffer Object)即VBO的使用,使用VBO来实现金字塔和立方体的绘制, 绘制的效果和上一章相同。这个系列教程主要是采用实例演示 Opengl ES 1.x NDK开发,对一些要点进行解释,因此对API的用 法和说明较少,建议初学者可以参考Opengl ES 1.x的API手册。 本章示例了VBO缓存顶点、颜色和索引的用法。 >>>为什么要使用VBO? VBO的数据存放在显卡内存中,能节省从系统内存复制到显卡内存中的时间,提高 阅读详情

相关推荐

Opengl ES 1.x NDK实例开发之七:旋转的纹理立方体

本章在第六章(Opengl ES 1.x NDK实例开发之六:纹理贴图)的基础上绘制一个旋转的纹理立方体,原理和纹理贴图一样,需要注意的是定好正方体的顶点数组

【OpenGL ES】立方体手动旋转

本文主要介绍使用 OpenGL ES 绘制立方体,并实现手动触摸事件控制立方体旋转。为方便控制触摸旋转,假设旋转轴始终在 xoy 平面上,设 z 轴的方向向量 u = (0, 0, 1),触摸方向向量为 v(起点为ACTION_DOWN 时坐标,终点 ACTION_MOVE 时坐标),则旋转轴 w = u x v(x 为向量叉乘运算,运算结果仍然是一个向量,并且 w 垂直于 uov 平面)。在每次触摸结束时(ACTION_UP),为保证下次触摸事件与立

little_fat_sheep 3759

opengl es1.1 NDK 旋转的立方体

opengl es1.1作的旋转立方体的demo。环境eclipse+ndk+android。大家可以学习一下。

OpenGL绘制旋转立方体实例

通过上一节我们已经学会了使用OpenGL绘制2D图形,下面我们学习如果使用OpenGL绘制3D图形,让我们真正感受一下OpenGL的强大功能吧@         上一节我们是绘制了一个旋转的三角形和正方形,今天我们来使用OpenGL绘制一个旋转的正方体。         绘制正方体基本上和绘制三角形,正方形差不多,重点在于构建正方体的坐标。在构建这些顶点坐标时,要让对象绕自身的轴旋转,必须让对

flystar0307的博客 3578

绘制旋转的正方形(来自opengl编程指南)

该代码是用来绘制一个旋转的正方形,里面涉及gltranslatef,glrotatef等。

告别FreeRTOS?手把手带你用NuttX在STM32F4-Discovery上跑起第一个Shell

本文详细介绍了如何在STM32F4-Discovery开发板上从FreeRTOS迁移到NuttX,并运行第一个Shell。NuttX以其完整的POSIX兼容性和模块化架构优势,特别适合复杂网络应用的开发。通过环境搭建、移植配置、调试技巧及POSIX开发实践,帮助开发者高效构建嵌入式系统。

weixin_42526417的博客 300

android opengl es 3d 贴图 旋转立方体demo

效果展示源码和apk的下载资源下载核心代码package com.rex;import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLSurfaceView; import android.opengl.GLU; import android.opengl.GLUtils

qq_28844947的博客 1724

SpringBoot整合oceanbase,实现oracle无缝切换到oceanbase

随着去“IOE”化的潮流,近些年来,许多与国家相关的项目不约而同到地往”国产化“方向靠拢,不可避免地,一些项目可能需要进行数据库迁移。

4624

android OpenglES2.0之立体模型展示(缩放+旋转+光照+纹理)

                                                                                                                            心若止水,无坚不摧。 为了绘制一个3D立体模型,你需要掌握一下知识点: 1、GLSurfaceview 2、渲染器render 3、管线渲染的流...

zhang_he_xiang的博客 2744

数据资产目录(SailCatalog)和数据地图(SailMap)

笔者接下来准备开发大数据平台(XSailboat)中的数据资产目录(SailCatalog)和数据地图(SailMap)相关的功能,本文用以记录笔者关于此部分功能的概念梳理和主体功能设计。

OkGogooXSailboat的博客 2327

电商平台大数据分析指标

一、五大关键数据分析指标 1.1活跃用户量 活跃用户量是一个基本的指标,有 DAU(日活跃用户)、WAU(周活跃用户)和 MAU(月活跃用户)三个层次; 1.2转化 转化是一个非常重要的指标,电商运营需要关注主路径、次路径甚至精细到每一个品类 / SKU 的转化率; 1.3留存 留存要从不同的时间周期上研究,包括次日留存率、3 日、7 日、30 日留存; 1.4复购 复购则要从 3 个角度去看,复购用户量、复购率和复购金额比; 1.5GMV GMV 是最重要的指标,我们的运营最终是围绕这

默主归沙的博客 4820

goFlyer

说到矩阵变换,我们第一时间想到的就是大学时代的线性代数这些复杂的东西,突然有了一种令人从入门到放弃的念头,不慌,作为了一个应用层的CV工程师,在实际应用中线性代数哪些复杂的计算根本不用我们自己去算,绝大部分情境下直接使用Matrix这个类或者glm这个库即可。关于矩阵与向量的相关知识,矩阵的加减乘除等规则,这里就不展开细说,感兴趣的同学自行查阅线性代数即可,不过这些规则忘记了也没关系,反正有API可用。

supeerzdj的博客 231

CXL3.0 CDAT(Coherent Device Attributes Table)

在说明CDAT之前,先讲一下CXL中的DOE类型:CXL协议里定义了两种DOE的类型,一种是Compliance就是合规性测试的内容,还有一种就是CDAT(一致性属性表)Memory_Info_Valid是CXL设备的内存配置完成标志,位于DVSEC(Designated Vendor-Specific Extended Capability)的CXL Range X Size Low寄存器中(X为1或2)。

Summer的博客 1437

Opengl ES 1.x NDK实例开发之八:旋转的纹理金字塔

开发框架介绍请参见:Opengl ES NDK实例开发之一:搭建开发框架 本章在第六章(Opengl ES 1.x NDK实例开发之六:纹理贴图)的基础上绘制一个旋转的纹理金字塔,原理和纹理贴图一样,需要注意的是定好金字塔的顶点数组和纹理数组。 【实例讲解】 【实例源码】 [GLJNIActivity.java] /* * Copyright (

give me five 2421

手把手教你解决CentOS sshd启动报错:从权限问题到目录缺失的全套解决方案

本文提供了一套完整的CentOS SSH服务启动故障排查与修复方案。针对sshd启动报错,从systemd日志分析、sshd -t配置测试入手,详细解决了私钥文件权限过宽(如0644错误)和权限分离目录缺失等典型问题,并附带了扩展排查清单,帮助运维人员系统性地定位和解决连接故障。

weixin_29248611的博客 152

TLV320AIC3204音频CODEC硬件设计与调试实战

本文深入解析了TLV320AIC3204音频CODEC的硬件设计与调试实战。文章从芯片功能定位入手,详细阐述了电源时钟设计、模拟输入电路等关键硬件设计要点,并提供了软件驱动配置与分层调试方法,帮助工程师有效规避常见陷阱,解决底噪、失真等典型音频调试问题。

zero1的博客 1129

Opengl ES 1.x NDK实例开发之六:纹理贴图

开发框架介绍请参见:Opengl ES NDK实例开发之一:搭建开发框架 本章在第三章(Opengl ES 1.x NDK实例开发之三:多边形的旋转)的基础上演示如何使用纹理贴图,分别实现了三角形纹理贴图和正方形纹理贴图。 【实例讲解】 OpenglES要求生成纹理的图片长宽为2的n次方,支持各种格式(BMP, GIF, JPEG, PNG...) 本例中使用的图片为png格式,尺寸为128*128 本例中,在上层GLJNIView.java中生成纹理,将纹理句柄传递给Native层进行绘制,详见 priv

give me five 5607

第十四节《OpenCascade集成Qt》

将 OpenCascade 与 Qt 集成是开发图形界面应用的常见需求。通过将 OpenCascade 的几何建模与 Qt 的图形用户界面(GUI)功能结合,可以创建强大而灵活的 CAD 或建模工具。OpenCascade 提供了与 Qt 的集成接口,允许你在 Qt 应用程序中嵌入 OpenCascade 的视图,执行几何操作,并与用户进行交互。以下是 OpenCascade 与 Qt 集成的详细步骤:首先,确保已安装 OpenCascade 和 Qt。你可以从 OpenCascade 官方网站或通过包管理

yumeiguo的博客 597

Opengl ES 1.x NDK实例开发之三:多边形的旋转

转自:http://blog.csdn.net/mnorst/article/details/40046511 【实例讲解】 本章在第二章的基础上讲解多边形的旋转 上图中的三角形和四边形沿着Y轴旋转 【实例源码】 [GLJNIActivity.java] [java]view plaincopy /* ...

148

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android opengl es 3.0 + ndk 绘画涂鸦项目

前言 写一个opengl es 3.0 + ndk 的绘画涂鸦项目,命名为白板哈哈哈,记录自己遇到的问题,顺便学到的知识整合一遍,算是对自己一段时间的总结。 项目地址:Whiteboard 如果对你有帮助,不妨点个start支持一下。感谢 效果图 调研如何绘制,具体思路? 主要调研的结果是方式有两种,一种是使用原生的 api 线条+drawPath 绘制贝塞尔曲线 而笔触纹理 可以通过 Canvas 生成圆点bitmap。 输出可以使用两个bitmap作为交换显示,形成一个双缓冲机制。 我之前写了一.

L 4862

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: Opengl ES 1.x NDK实例开发之三:多边形的旋转
下一篇: Opengl ES 1.x NDK实例开发之五:顶点缓存VBO
mnorst
博客等级 码龄16年 38粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值