1. 程式人生 > >圖形學程式設計學習日誌01

圖形學程式設計學習日誌01

1.obj檔案的讀取

#include<sstream>
#include <string> 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#include <iostream>
#include <fstream>
#include <GL/GLAUX.H>	
#pragma comment(lib, "glew32.lib")
#pragma   comment(lib,"glaux.lib ")   
using namespace std; 


float eye[3] = {0,0,0};

float degreex=0;
float degreey=0;
float degreez=0;
string s1;
GLfloat f2,f3,f4;
int v_num=0; //記錄點的數量
int vn_num=0;//記錄法線的數量
int f_num=0; //記錄面的數量
GLfloat **vArr; //存放點的二維陣列
GLfloat **vnArr;//存放法線的二維陣列
int **fvArr; //存放面頂點的二維陣列
int **fnArr; //存放面法線的二維陣列

//int v_num=382; 
//int vn_num=382; 
//int f_num=760;  
//GLfloat vArr[382][3]; 
//GLfloat vnArr[382][3];
//
//int fvArr[760][3];  
//int fnArr[760][3];  




 int counta(string addr)//計數函式
  { 
	    ifstream filea(addr.c_str());
		cout << "讀取檔案"<<endl;
		if (!filea)
		{
			cout << "讀取檔案失敗";
			return -1;
		}

	string strline; 
	  
	 while(getline(filea,strline))
	 {
		if(strline[0]=='v')
		{
			if(strline[1]=='n')//vn得到法線的數目
			 {vn_num++;
			 }
			 if(strline[1]==' ')//v得到頂點的數目
			 {v_num++;
			 }
		}
		if (strline[0]=='f')  //得到面的數目
		{f_num++;
		}

	}
 
//cout<<v_num<<endl<<vn_num<<endl<<f_num<<endl;

	int i=0;
	vArr=new GLfloat*[v_num];//開闢存放頂點的空間
	for (int i=0;i<v_num;i++)
	{
	  vArr[i]=new GLfloat[3];
	}
	vnArr=new GLfloat*[vn_num];//開闢存放法線的空間
	for (i=0;i<vn_num;i++)
	{
	  vnArr[i]=new GLfloat[3];
	}
	fvArr=new int*[f_num];//面
	fnArr=new int*[f_num];
	for (i=0;i<f_num;i++)
	{
	  fvArr[i]=new int[3];
	  fnArr[i]=new int[3];
	}
  
	  return 0;
 }


int reada(string addr)  //讀取檔案內容並存儲各個陣列
{
	ifstream filea(addr.c_str());
	cout << "load……"<<endl;
	if (!filea)
		{
			cout << "讀取檔案失敗";
			return -1;
		}

	string strline; 
	int ii=0,jj=0,kk=0;	 
	while(getline(filea,strline))
	{
	if(strline[0]=='v')
		{
		  if(strline[1]=='n')//vn
		  {
			istringstream strin(strline);
			strin>>s1>>f2>>f3>>f4;
			vnArr[ii][0]=f2;
			vnArr[ii][1]=f3;
			vnArr[ii][2]=f4;
			ii++;
		  }
		  if(strline[1]==' ')//v
		  {
			istringstream strin(strline);
			strin>>s1>>f2>>f3>>f4;
			vArr[jj][0]=f2;
			vArr[jj][1]=f3;
			vArr[jj][2]=f4;
			jj++;
			//cout<<"good";
		  }
		}
	if (strline[0]=='f') //讀取面
	{
		  istringstream in(strline);
		  GLfloat a;
		  
		  in>>s1;//去掉字首f
		  int i,k;
		  
		  for(i=0;i<3;i++)
		  {
				in>>s1;
			  //  cout<<s1<<endl;
				//取得頂點索引和法線索引
				a=0;						 
				for(k=0;s1[k]!='/';k++) 
				{
					//cout<<s1[k]<<endl;
				  a=a*10+(s1[k]-48);
			  // cout<<a<<endl;
				}
				fvArr[kk][i]=a;
			k++;
			   for(;s1[k]!='/';k++) 
			   {;
			   }

				a=0;

				for(k=k+1;s1[k];k++)
				{
				  a=a*10+(s1[k]-48);
				}
				fnArr[kk][i]=a;
			}
	  kk++;
	 }
	}
	filea.close();
	return 0;
}
到這裡就已經把整個檔案讀取成功了,下一步應該是要用opengl把整個模型檔案描繪出來。

相關推薦

圖形程式設計學習日誌01

1.obj檔案的讀取 #include<sstream> #include <string> #include <stdio.h> #include <stdlib.h> #include <math.h> #i

C#程式設計學習01):北斗時轉日曆時的小程式

需求說明:給定nav格式的北斗時檔案從中提取出北斗周和周內秒資訊,將該資訊轉化為日曆時 軟體介面: 設計流程: 1. 變數定義: 批量處理: 開啟,btn_openFile; 轉換, btn_timeTrans 單一轉換:北斗周對應文字框,txb_bdsWeek;周內秒對應

使用Scratch2和ROS進行機器人圖形程式設計學習

使用Scratch2和ROS進行機器人程式設計學習(適用於中小學機器人程式設計Scratch和ROS)參考JdeRobot的一篇詳細介紹,就可以實現上述的功能,需要安裝Scratch2、ROS Kinetic、Gazebo 7、JdeRobot、Python2.7等。通過將S

html5學習日誌01

html5 W3C標準 W3C World Wide Web Consortium(全球資訊網聯盟) 成立於1994年,Web技術領域最權威和具影響力的國際中立性技術標準機構 http://www.w3.org/ http://www.chinaw3c.org/ W3

servlet學習日誌01

javaweb web開發是基於請求和響應的: 請求:瀏覽器(客戶端)向伺服器傳送資訊 響應:伺服器向瀏覽器回送資訊 請求和響應是成對出現的。web資源分類 所謂web資源即放在Internet網上供外界訪問的檔案或程式,又根據它們呈現的效果及原理不同,將它們劃分為靜態資

我的程式設計學習日誌(15)--C/C++實現輸出漢字拼音的首字母

說實話,寫的程式越多,就越討厭漢字,因為漢字在計算機裡的編碼不統一,不像英文字母那樣一個ascll碼就解決。 就比如做的那個地鐵導航,還有flppy bird程式,當時就被怎麼查漢字還有漢字編碼轉換問

蘇嵌學習日誌01

姓名:高翔 日期:2018.9.3 今日學習任務:安裝實訓環境,學習c語言中指標陣列等概念。 今日任務完成情況:今日任務較少,程式碼量較小,主要為老師例程執行,瞭解指標概念 e.g. : #include<stdio.h> #inclu

計算機圖形學習

隱式曲面(Implicit Surface)的造型:就是用函式形式為F( x ,y ,z ) = 0的曲面進行造型,這樣的造型技術適合描述動物器官一樣的肉乎乎的東西,有2本書推薦大家Jules Bloomenthal編輯的Introduction to Implicit Surfaces,是一本專著,講述了I

我的程式設計學習日誌(5)-- 教你快速的輸入程式碼(程式設計競賽中的小技巧)

1,typedef簡化輸入 在程式設計中如果用到結構體,每次定義變數時都要輸很長的程式碼,特別是在建連結串列時,經常重複輸入struct…,為了避免這種重複,可以用typedef 。 不過不建議在實際

Java學習日誌01

基本概念: 基本的Java術語 JRE :java執行環境 J2SE:java2標準環境 J2ME:java2手機開發環境 J2EE:java2企業級開發環境 JVM:java虛擬機器 3年以上工作經驗,有至少1個大型專案經驗,精通JSP,Servlet,JNDI,EJB

Egret白鷺引擎學習日誌01

1.簡介 egret是一個開源免費的遊戲框架,它使用TypeScript指令碼語言進行開發; 2.下載安裝包 下載完成後根據提示進行安裝​ 根據自己需求進行安裝相應版本 3.下載工具 根據需求下載相應工具,我學習開始下載的工具也就是圖下已安裝的工具

關於計算機圖形學習

引言 什麼是計算機圖形學? 本文儘量避免給它做嚴格的定義,但是通常來說,計算 機圖形學是數字圖象處理的逆過程,這只是一個不確切的定義,後面我們會看到, 實際上,計算機圖形學、數字圖象處理和計算機視覺在很多地方的區別不是非常 清晰的,很多概念是相通的。 計算機圖形學是

Directx9.0 學習教程3 -圖形之創建點 線 三角形 等

d3d custom 發現 介紹 data- directx 組成 water 詳細 1、首先 介紹點的表示方法 struct CUSTOMVERTEX { float x,y,z; }; CUSTOMVERTEX Vertices[] = { {-5.0

路飛城-Python開發集訓-學習心得01

年輕 小夥伴 java 可能 有導師 視頻 進行 互聯 mil   不知不覺,已經進行了10個日夜,在7月7之前,有過接觸甚至有半年的時間看過相關python書籍乃至小視頻, 但正如所說,在沒有什麽編程基礎的情況下,考自學學成率不足5%。回想起來0基礎學java被某內忽悠,

CS184.1X 計算機圖形導論 第7講 V1-3 學習筆記

線上 物體 創建 strong 公式推導 導論 幾何 ng- 解決方法 L7V1:OPENGL 著色:學習動機 1.光照的重要性 1)能夠真正顯示出形狀感知的外觀; 2)準確的著色和光照對對傳達物體的形狀非常重要; 3)著色的方式也十分重要:平面著色(GL_FLAT)、平滑

CG-光柵圖形直線掃描轉換算法-學習筆記

圖形 點畫 整數 mar bresenham bsp pla 位移 ali 一、直線掃描轉換算法——DDA畫線算法 備註:DDA(Digital Differential Analyzer) ---> 數值微分法 1. 引進圖形學中的一個很重要的思想——增量思想 2.

CG-光柵圖形裁剪算法-學習筆記

復雜 顯示 圖形 因此 延長 比較 信息 spa 矩形區域 一、引入 1. 為什麽要裁剪?——使用計算機處理圖形信息時,計算機內部存儲的圖形往往比較大,而屏幕顯示的知識圖形的一部分。因此需要確定圖形哪些部分落在顯示區之內,哪些落在顯示區之外。這個過程就稱為裁剪。 2. 點的

CG-光柵圖形消隱算法-學習筆記

朝向 需要 窗口 在外 ber pan inf 出現 一段 【引入】 1. 目的:當我們觀察空間任何一個不透明的物體時,只能看到該物體朝向我們的那些表面,其余的表面由於物體所遮擋我們看不到。所以需要消隱,來消除被遮擋的不可見的線或面,消除二義性,繪制出意義明確、富有真實感

2018/10/01學習日誌

1, 運算子, 運算子的優先順序, 邏輯運算子, 條件運算子,條件表示式, ++,--操作符,  位運算,  2, 基本把第三章內容看懂了,  3 部分運算子優先順