Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 中文字幕在线观看一区二区三区,在线一区二区观看,亚洲日本在线播放

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          emsite框架是一個分布式的后臺全自動快速開發框架

          臺簡介: emsite框架是一個分布式的后臺全自動快速開發框架,采用dubbo作為服務層框架,后臺將集成單點登錄、Auth2.0、storm+kafka消息處理系統、kafka+ flume+storm+hdfs+hadoop作為日志分析系統、配置中心、分布式任務調度系統、服務器實時監控系統、搜索引擎系統(elasticsearch)。以上各大功能將作為模塊化集成到本項目。

          框架簡介

          • emsite框架是基于眾多優秀的開源項目,高度整合封裝而成的高效,高性能,強安全性的開源Java EE分布式全自動快速開發框架平臺。 系統自帶全自動增量發版功能.
          • emsite目前包括以下五大模塊,系統管理(SYS)模塊、代碼生成(GEN)模塊、全自動增量發版(PATCH)模塊、運營日志分析模塊(規劃中)、系統監控預警模塊(規劃中)
          1、系統管理模塊,包括組織架構(用戶管理、機構管理、區域管理)、菜單管理、角色權限管理、字典管理等功能; 
          2、代碼生成模塊,完成重復的工作;
          3、全自動增量發版,輕松完成版本快速迭代;
          
          • emsite框架擁有 全自動增量發版子項目模塊 [emsite-patch],該模塊可以對git/svn管理的項目進行增量代碼生成用于增量發版。總共包含四種生成方案:
          1、git服務器分支提交分析;
          2、git提交日志分析;
          3、svn服務器分支提交分析;
          4、svn提交日志分析;
          

          框架規劃

          • emsite采用dubbo作為服務層框架,后臺將集成單點登錄、oauth2.0、storm+kafka消息處理系統、kafka+flume+storm+hdfs+hadoop作為日志分析系統、配置中心、分布式任務調度系統、服務器實時監控系統、搜索引擎系統(elasticsearch),各大功能將作為模塊化集成到本項目。
          • emipre團隊后期兩款產品:
          1、在線客服開源系統;
          2、統一微信公眾號管理平臺;
          

          emsite生態圈

          01、emsite框架(獨立主分支master)
          02、emsite微信公眾號管理平臺(獨立分支wxdev)
          03、emsite在線客服開源系統(獨立項目:[emipre-ons-talk-parent](https://gitee.com/hackempire/empire-ons-talk-parent))
          04、emstie框架springboot+springcloud版本(獨立項目:[emsite-cloud](https://gitee.com/hackempire/emsite-cloud))
          05、emsite框架soa框架(獨立項目,遠程RPC服務框架【服務熔斷、降級、限流、異步、分布式、全鏈路監控】)
          06、增量部署項目,支持git/gitee/svn(獨立項目:[patch-generator](https://gitee.com/hackempire/patch-generator-parent))
          07、增量部署桌面版項目,支持git/gitee/svn(獨立項目:[patch-generator-desk](https://gitee.com/hackempire/patch-generator-desk))
          08、全能監控項目地址(獨立項目:[omnipotent-monitoring](https://gitee.com/hackempire/omnipotent-monitoring))
          

          框架調整計劃表【歡迎有志者加盟】

          一階段:

          01、文檔整理更新,數據庫初始化excel和emsite-mysql.sql腳步同步更新[2018-02-07---2018-02-11]----已完成
          02、JavaMelody和druid監控的分布式支持擴展[2018-02-07---2018-02-22]----執行中(ing)
          03、代碼優化之vo、dto層分離[2018-02-23---2018-03-10]----已結束
          04、poi文件導出、導入優化解耦[2018-03-06---2018-03-15]----延期執行
          05、分布式任務調度系統集成[2018-03-01---2018-03-05]----延期執行
          06、kafka+flume+storm+hdfs+hadoop日志分析系統模塊功能開發、當前日志系統架構優化[2018-03-13---2018-04-01]----延期執行
          07、框架部署結構動靜分離調整[ngnix+httpd],框架文件系統圖片資源服務器架構調整[fastDFS][2018-04-01---2018-04-10]----延期執行
          08、增量部署系統模塊開發【SVN增量方案、GIT增量方案】----已完成
          09、Apache ActiveMQ/Apache RocketMQ內部消息系統集成
          10、emsite框架配置優化,集成配置中心
          11、cas單點登錄、jwt權限集成
          12、微信公眾號第三方平臺基礎功能開發(公眾號管理、自定義菜單管理、粉絲管理、群發管理、素材管理)----計劃執行
          13、微信接口調用監控功能開發
          14、在線客服開源系統
           a.openfire+smack+微信h5+swing/javafx(待定)+sip服務器集成(待定)+軟硬電話集成+智能機器人
           備選技術:
           xmpp:Jabber、openfire
           sip:Asterisk、Cipango、FreeSwitch、SIPServer2008、opensips、Kamailio、OpenSER、sipXecx、miniSipServer、Brekeke、
           GNU SIP Witch、Mobicents、Mysipswitch、SailFin、SIP Express Router、sipX、Yate、YXA
           智能機器人:圖靈機器人、百度AI機器人、青云客智能聊天機器人
          15、微信公眾平臺插件開發(大轉盤、在線門店、微信論壇、微信商城)
          16、Solr/Elasticsearch搜索引擎系統集成
          17、Swagger2系統開放Api接口文檔測試系統集成
          18、系統架構部署文檔、部署視頻教程、wiki文檔、系統模塊分析文檔完善等
          19、Jenkins持續集成方案整理
          20、遠程RPC服務框架開發【服務熔斷、降級、限流、異步、分布式、全鏈路監控】
          21、產品全線上線、開啟框架培訓社區、開啟框架交流論壇
          22、springboot+springcloud框架版本開發----計劃執行
          23、Mybatis分頁插件PageHelper集成、分頁功能解耦----已完成
          24、內容管理模塊功能刪除----已完成
          

          二階段

          25、emsite后臺管理系統UI全新升級(備選方案:https://adminlte.io)
          26、前后端分離架構調整,框架版本2.0(node.js、bigpipe、KnockoutJS/AngularJS/vueJS/ReactJS待定)
          27、dao層優化,集成mybatis-plus----已擱置
          28、Activiti工作流+在線OA系統模塊開發----已擱置
          

          emsite框架最新動態

          1.經項目組研究討論,由于JavaMelody/druid等分布式擴展后只支持內外IP訪問各臺服務器,且如需要支持外網分布式監控,需要增加監 
           控域名和Nginx搭配,故該條規劃已擱置,轉由zabbix server、Tomcat-manager、lambda probe進行全方位監控,后期將開放以上三
           個監控方案的文檔至項目QQ群;另外本項目后期將考慮jmx自建部分組件的監控體系,敬請期待[2018-02-18]
          2.重大喜訊:阿里巴巴已將dubbo項目已正式成功捐獻給apache基金會孵化,由于apache目前還沒比dubbo更處理更有力的分布式服務框架
           (soa),故預測dubbo將在不久成為apache頂級項目,且同spring cloud平分soa分布式服務的半壁江山[2018-02-18]
          3.重要通知:由于本次dto和vo層改造忘記拉分支,所以將會直接在主分支上進行,提交的代碼皆為可允許的代碼!如果想拉改造之前的代碼
           請進入項目標簽中下載[2018-03-08]
          4.最新通知:emsite-cloud項目正式立項(進入技術調研籌備階段),將采用目前最火的技術springboot+springcloud來實現,項目地址
           https://gitee.com/hackempire/emsite-cloud[2018-03-08]
          5.經架構分析,后臺管理系統部分不適合做dto層拆分.emsite架構將采用前后端架構分離,前臺(如微信h5功能)使用dto層作為數據傳輸對象,
           后臺(如微信的數據管理)采用之前的entity作為數據傳輸對象.另外前后臺API隔離,前臺部分新開發dubbo接口、dto等.[2018-03-20]
          6.框架完成升級到jdk1.8,spring4.2.2.RELEASE,maven打包插件升級到最新版本,全自動增量發版功能[2018-04-07]
          7.增量打包桌面版已開發完畢,正式發布版本2.0,請關注patch-generator-desk
           項目地址:https://gitee.com/hackempire/patch-generator-desk[2018-05-01]
          

          內置功能

          1、用戶管理:用戶是系統操作者,該功能主要完成系統用戶配置。
          2、機構管理:配置系統組織機構(公司、部門、小組),樹結構展現,可隨意調整上下級。
          3、區域管理:系統城市區域模型,如:國家、省市、地市、區縣的維護。
          4、菜單管理:配置系統菜單,操作權限,按鈕權限標識等。
          5、角色管理:角色菜單權限分配、設置角色按機構進行數據范圍權限劃分。
          6、字典管理:對系統中經常使用的一些較為固定的數據進行維護,如:是否、男女、類別、級別等。
          7、操作日志:系統正常操作日志記錄和查詢;系統異常信息日志記錄和查詢。
          8、連接池監視:監視當期系統數據庫連接池狀態,可進行分析SQL找出系統性能瓶頸。
          

          為何選擇emsite

          1、使用 Apache License 2.0 協議,源代碼完全開源,無商業限制。
          2、使用目前主流的Java EE開發框架,簡單易學,學習成本低。
          3、數據庫無限制,目前支持MySql、Oracle,可擴充SQL Server、PostgreSQL、H2等。
          4、模塊化設計,層次結構清晰。內置一系列信息管理的基礎功能。
          5、操作權限控制精密細致,對所有管理鏈接都進行權限驗證,可控制到按鈕。
          6、數據權限控制精密細致,對指定數據集權限進行過濾,七種數據權限可供選擇。
          7、提供在線功能代碼生成工具,提高開發效率及質量。
          8、提供常用工具類封裝,日志、緩存、驗證、字典、組織機構等,常用標簽(taglib),獲取當前組織機構、字典等數據。
          9、兼容目前最流行瀏覽器(IE7+、Chrome、Firefox)。
          10、最流行的分布式解決方案。
          11、dubbo已正式進入apache基金會孵化,前程似錦,可以說已與spring cloud分別坐擁分布式服務框架的半壁江山.
          

          技術選型

          1、后端

          a、核心框架:Spring Framework 4.2.2
          b、分布式服務框架:dubbo2.5.8、dubbo-admin、dubbo-monitor
          c、分布式協調組件:zookeeper3.4.6
          d、服務跟蹤:Hydra(京東)
          e、分布式配置:apollo(攜程)/disconf(百度)/diamond(阿里)
          d、安全框架:Apache Shiro 1.2
          e、視圖框架:Spring MVC 4.2.2
          f、服務端驗證:Hibernate Validator 5.2
          g、布局框架:SiteMesh 2.4
          h、任務調度:Spring Task 4.2.2
          i、持久層框架:MyBatis 3.2
          j、數據庫連接池:Alibaba Druid 1.0
          k、緩存框架:Ehcache 2.6、Redis
          l、日志管理:SLF4J 1.7、Log4j
          m、數據庫管理工具(備份、初始化):dbunit(當前使用)、Flyway
          n、工具類:Apache Commons、Jackson 2.2、Xstream 1.4、Dozer 5.3、POI 3.9
          o、監控架構:zabbix server、Tomcat-manager、lambda probe、cat
          p、持續集成方案:Jenkins
          

          2、前端

          a、JS框架:jQuery 1.9。
          b、CSS框架:Twitter Bootstrap 2.3.1(穩定后臺,UI方面根據需求自己升級改造吧)。
          c、客戶端驗證:JQuery Validation Plugin 1.11。
          d、富文本在線編輯:CKEditor
          e、在線文件管理:CKFinder
          f、動態頁簽:Jerichotab
          g、手機端框架:Jingle
          h、數據表格:jqGrid
          i、對話框:jQuery jBox
          j、下拉選擇框:jQuery Select2
          k、樹結構控件:jQuery zTree
          l、日期控件: My97DatePicker
          

          3、平臺

          a、服務器中間件:在Java EE 5規范(Servlet 3.0、JSP 2.1)下開發,支持應用服務器中間件 有Tomcat 7+、Jboss 7+、
           WebLogic 10+、WebSphere 8+。
          b、數據庫支持:目前僅提供MySql或Oracle數據庫的支持,但不限于數據庫,平臺留有其它數據庫支持接口, 你可以很方便
           的更改為其它數據庫,如:SqlServer 2008、MySql 5.5、H2等
          c、開發環境:Jdk1.7+(默認jdk1.8)、(Eclipse Java EE 4.3|sts-3.6.2.RELEASE|myeclipse10)、Maven 3.2+、Git
          

          安全考慮

          a、開發語言:系統采用Java 語言開發,具有卓越的通用性、高效性、平臺移植性和安全性。
          b、分層設計:(數據庫層,數據訪問層,業務邏輯層,展示層)層次清楚,低耦合,各層必須通過接口才能接入并進行參數校
           驗(如:在展示層不可直接操作數據庫),保證數據操作的安全。
          c、雙重驗證:用戶表單提交雙驗證:包括服務器端驗證及客戶端驗證,防止用戶通過瀏覽器惡意修改(如不可寫文本域、隱藏
           變量篡改、上傳非法文件等),跳過客戶端驗證操作數據庫。
          d、安全編碼:用戶表單提交所有數據,在服務器端都進行安全編碼,防止用戶提交非法腳本及SQL注入獲取敏感數據等,確保數據安全。
          e、密碼加密:登錄用戶密碼進行SHA1散列加密,此加密方法是不可逆的。保證密文泄露后的安全問題。
          f、強制訪問:系統對所有管理端鏈接都進行用戶身份權限驗證,防止用戶
          g、服務監控:系統采用dubbo的服務全鏈路監控技術、可以做到精準定位服務情況
          

          快速體驗

          a、具備運行環境:JDK1.7+、Maven3.2+(建議3.5.3)、MySql5+或Oracle10g+。
          b、下載emsite-parent項目,導入第三方ckfinder插件jar包到本地maven庫
          c、修改src\main\resources\emsite.properties文件中的數據庫設置參數。
          d、根據修改參數創建對應MySql或Oracle數據庫用戶和參數。
          e、新建數據庫emsite[字符集utf8 -- UTF-8 Unicode,排序規則utf8-bin],運行db\init-db.bat腳本,即可導入表結構及演示數
           據(linux操作系統:在控制臺中切換至項目根目錄,運行命令:mvn antrun:run -Pinit-db);或者直接在數據庫工具中運行emsite 
           web項目db目錄下的emsite_mysql.sql文件。
          f、啟動redis,zookeeper組件
          g、啟動emsite-service-dbs數據服務層項目,使用eclipse maven啟動命令:clean tomcat7:run(校驗:http://localhost:端口/emsite- 
           service-dbs出現HelloWorld頁面)
          h、啟動emsite web服務器項目,運行目錄下bin\run-tomcat7.bat或bin\run-jetty.bat 或使用eclipse maven啟動命令:clean 
           tomcat7:run(第一次運行,需要下載依賴jar包,請耐心等待,校驗:http://localhost:端口/emsite出現后臺登錄頁面)。
          i、最高管理員賬號,用戶名:emsite 密碼:admin 
          

          常見問題

          a、用一段時間提示內存溢出,請修改JVM參數:-Xmx512m -XX:MaxPermSize=256m
          b、有時出現文字亂碼:修改Tomcat的server.xml文件的Connector項,增加URIEncoding="UTF-8"
          c、為什么新建菜單后看不到新建的菜單?因為授權問題,菜單管理只允許最高管理員賬號管理(最高管理員默認賬號:emsite密碼:admin)。 
          d、第三方ckfinder導入方案[ckfinder包放在emsite項目下lib文件夾中]
           mvn install:install-file -DgroupId=com.ckfinder -DartifactId=ckfinder -Dversion=2.3 -Dpackaging=jar - 
           Dfile=D:/thirdxsd/ckfinder-2.3.jar
           mvn install:install-file -DgroupId=com.ckfinder -DartifactId=ckfinderplugin-fileeditor -Dversion=2.3 -Dpackaging=jar -
           Dfile=D:/thirdxsd/ckfinderplugin-fileeditor-2.3.jar
           mvn install:install-file -DgroupId=com.ckfinder -DartifactId=ckfinderplugin-imageresize -Dversion=2.3 -Dpackaging=jar - 
           Dfile=D:/thirdxsd/ckfinderplugin-imageresize-2.3.jar
           mvn install:install-file -DgroupId=com.empire -DartifactId=patch-generator -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar - 
           Dfile=D:/thirdxsd/patch-generator-0.0.1-SNAPSHOT.jar
          e、項目類文件報錯或者jar包不存在
           解決方法:
           1.eclipse點擊project->clean->選擇emsite所有模塊->ok 
           2.選擇emsite-parent父項目->右鍵->debug as->maven -clean
           3.選擇emsite-parent父項目->右鍵->debug as->maven -install
           4.選中報emsite其它jar模塊引入失敗的項目->右鍵->maven->update project->選中online、force Update of Snapshots/Releases、
           update project configuration from pom.xml、Refresh workspace resources from local filesystem、clean project等選項
           ->點擊ok
           5.更新完成然后重復上面2、3步驟,問題解決
          f、maven報錯Project configuration is not up-to-date with pom.xml錯誤解決方法(導入項目之后發現有一個如下的錯誤:Project 
           configuration is not up-to-date with pom.xml. Run project configuration) 
           update
           其實這個問題解決非常簡單:
           在項目上右鍵——【Maven】——【Update Project Configuration……】
           這時會打開一個(Update Maven Dependencies)的對話框,然后勾選住出錯的項目,點擊Ok,這樣就搞定了。
          g、dubbo服務鏈追蹤與監控
           下載dubbo-monitor或dubbo-admin監控項目進行部署
          h、項目spring配置文件spring-context-dubbo.xml報錯dubbo標簽不支持,請用開發工具關聯在emsite項目lib文件夾下面的dubbo.xsd.
          i、更換其它數據庫需修改配置文件emsite.property中數據庫連接配置,如果添加子項目模塊并且修改為其它數據庫,需要新建Global并且覆蓋
           emsite-service-common-api中Global類的jdbcType方法用于支持數據庫分頁插件.
          j、項目啟動報dubbo配置的service無法啟動,刪除emsite->webapp->web-info->classes文件夾下面的所有文件
          k、如果在jdk8中用maven-tomcat插件運行項目報無效的1.8目標,請在環境中M2_HOME為最新apache-maven-3.5.3,并且將eclipse中jdk配置
           Default VM agrments設置:-Dmaven.multiModuleProjectDirectory=M2_HOME
          

          項目結構:

          01、emsite-parent----------------maven-parent模塊 
          02、emsite-service-common-api----common-service-api
          03、emsite-service-common-dbs----common-service-dbs
          04、emsite-service-api-----------core-service-api
          05、emsite-service-dbs-----------core-service-dbs
          06、emsite-----------------------emsite-web后臺管理
          07、emsite-patch-----------------emsite增量發版模塊
          

          運行效果:

          運行內存:

          spring-tool-suite(sts開發工具)JVM配置如下:

           -vmargs
           -Dosgi.requiredJavaVersion=1.6
           -Xverify:none
           -Xms1536m
           -Xmx1536m
           -Xmn512m
           -XX:NewSize=512m
           -XX:MaxNewSize=512m
           -XX:PermSize=256m
           -XX:MaxPermSize=256m
           -XX:+DisableExplicitGC
           -Xnoclassgc
           -XX:+UseParNewGC
           -XX:+UseConcMarkSweepGC
           -XX:CMSInitiatingOccupancyFraction=85
           -XX:+PrintGCDetails
           -XX:+PrintGCDateStamps
           -Xloggc:d:/sts-3.6.2.RELEASE/gc.log
           -Dorg.eclipse.swt.browser.IEVersion=10001
           -Dcon.sun.management.jmxremote
          

          1.emsite-service-dbs內存效果圖:

          2.emsite內存效果圖

          增量打包:

          git地址:https://gitee.com/hackempire/emsite-parent

          須先轉發,轉發,轉發,加“大數據java架構師”關注,然后私信

          jeesite”即可免費獲取源碼下載地址

          1.平臺簡介

          JeeSite是基于多個優秀的開源項目,高度整合封裝而成的高效,高性能,強安全性的開源Java EE快速開發平臺。

          JeeSite本身是以Spring Framework為核心容器,Spring MVC為模型視圖控制器,MyBatis為數據訪問層, Apache Shiro為權限授權層,Ehcahe對常用數據進行緩存,Activit為工作流引擎。

          JeeSite主要定位于企業信息化領域,已內置企業信息化系統的基礎功能和高效的代碼生成工具,包括:系統權限組件、數據權限組件、數據字典組件、核心工具組件、視圖操作組件、工作流組件、代碼生成等。前端界面風格采用了結構簡單、性能優良、頁面美觀大氣的Twitter Bootstrap頁面展示框架。采用分層設計、雙重驗證、提交數據安全編碼、密碼加密、訪問驗證、數據權限驗證。使用Maven做項目管理,提高項目的易開發性、擴展性。

          JeeSite目前包括以下三大模塊,系統管理(SYS)模塊、內容管理(CMS)模塊、在線辦公(OA)模塊、代碼生成(GEN)模塊。 系統管理模塊 ,包括企業組織架構(用戶管理、機構管理、區域管理)、菜單管理、角色權限管理、字典管理等功能; 內容管理模塊 ,包括內容管理(文章、鏈接),欄目管理、站點管理、公共留言、文件管理、前端網站展示等功能; 在線辦公模塊 ,提供簡單的請假流程實例。

          JeeSite 提供了常用工具進行封裝,包括日志工具、緩存工具、服務器端驗證、數據字典、當前組織機構數據(用戶、機構、區域)以及其它常用小工具等。另外還提供一個強大的在線 代碼生成 工具,此工具提供簡單的單表、一對多、樹結構功能的生成,如果對外觀要求不是很高,生成的功能就可以用了。如果你使用了JeeSite基礎框架,就可以很高效的快速開發出,優秀的信息管理系統。

          2.內置功能

          1.用戶管理:用戶是系統操作者,該功能主要完成系統用戶配置。

          2.機構管理:配置系統組織機構(公司、部門、小組),樹結構展現,可隨意調整上下級。

          3.區域管理:系統城市區域模型,如:國家、省市、地市、區縣的維護。

          4.菜單管理:配置系統菜單,操作權限,按鈕權限標識等。

          5.角色管理:角色菜單權限分配、設置角色按機構進行數據范圍權限劃分。

          6.字典管理:對系統中經常使用的一些較為固定的數據進行維護,如:是否、男女、類別、級別等。

          7.操作日志:系統正常操作日志記錄和查詢;系統異常信息日志記錄和查詢。

          8.連接池監視:監視當期系統數據庫連接池狀態,可進行分析SQL找出系統性能瓶頸。

          9.工作流引擎:實現業務工單流轉、在線流程設計器。

          3.開發工具

          1.Eclipse IDE:采用Maven項目管理,模塊化。

          2.在線演示:演示系統常用組件的使用代碼,內嵌地圖案例等。

          3.代碼生成:通過界面方式簡單配置,自動生成相應代碼,目前包括三種生成方式(增刪改查):單表、一對多、樹結構。生成后的代碼如果不需要注意美觀程度,生成后即可用。

          4.設計思想

          1、分層設計:(數據訪問層,業務邏輯層,展示層)層次清楚,低耦合,各層必須通過接口才能接入并進行參數校驗(如:在展示層不可直接操作數據庫),保證數據操作的安全。

          2、雙重驗證:用戶表單提交雙驗證:包括服務器端驗證及客戶端驗證,防止用戶通過瀏覽器惡意修改(如不可寫文本域、隱藏變量篡改、上傳非法文件等)而跳過客戶端驗證操作數據庫。

          3、安全編碼:用戶表單提交所有數據,在服務器端都進行安全編碼,防止用戶提交非法腳本及SQL注入獲取敏感數據等,確保數據安全。

          4、密碼加密:登錄用戶密碼進行SHA1散列加密,此加密方法是不可逆的。保證密文泄露后的安全問題。

          5、訪問驗證:系統對所有管理端鏈接都進行用戶身份權限驗證,防止用戶直接通過URL進行未授權頁面。

          6、數據驗證:對指定數據集權限進行過濾,七種數據權限可供選擇(所有權限,公司及子公司,本公司,部門及子部門,本部門,本人數據,跨機構數據)

          7、快速編碼:提供基本功能模塊的源代碼生成器,提高開發效率及質量。

          5.技術選型

          1、后端

          * 核心框架:Spring Framework 4.0

          * 安全框架:Apache Shiro 1.2

          * 視圖框架:Spring MVC 4.0

          * 服務端驗證:Hibernate Validator 5.1

          * 布局框架:SiteMesh 2.4

          * 工作流引擎:Activiti 5.15

          * 任務調度:Spring Task 4.0

          * 持久層框架:MyBatis 3.2

          * 數據庫連接池:Alibaba Druid 1.0

          * 緩存框架:Ehcache 2.6、Redis

          * 日志管理:SLF4J 1.7、Log4j

          * 工具類:Apache Commons、Jackson 2.2、Xstream 1.4、Dozer 5.3、POI 3.9

          2、前端

          * JS框架:JQuery 1.9。

          * CSS框架:Twitter Bootstrap 2.3.1。

          * 客戶端驗證:JQuery Validation Plugin 1.11。

          * 富文本:CKEcitor

          * 文件管理:CKFinder

          * 動態頁簽:Jerichotab

          * 手機端框架:Jingle

          * 數據表格:jqGrid

          * 對話框:jQuery jBox

          * 下拉選擇框:jQuery Select2

          * 樹結構控件:jQuery zTree

          * 日期控件: My97DatePicker

          4、平臺

          * 服務器中間件:在Java EE 5規范(Servlet 2.5、JSP 2.1)下開發,支持應用服務器中間件

          有Tomcat 6、Jboss 7、WebLogic 10、WebSphere 8。

          * 數據庫支持:目前僅提供Oracle數據庫的支持,但不限于數據庫,平臺留有其它數據庫支持接口,

          可方便更改為其它數據庫,如:SqlServer 2008、MySql 5.5、H2等

          * 開發環境:Java EE、Eclipse、Maven、Git

          6.必會基礎知識

          1.軟件工程基礎、Java語言基礎、JSP內置對象、EL表達式

          2.Spring Framework:類的依賴、自動注入、事務處理

          3.Spring MVC:URL映射、參數傳遞

          4.Apache Shiro:安全攔截方式,應用方法,控制按鈕

          5.SiteMesh:布局框架的用法

          6.JSP標準標簽庫(JSTL):if、choose、forEach、set

          7.Spring MVC表單標簽庫:form、input、textarea、select、checkbox

          8.文件存放規范,命名規范。

          7.學習索引

          1.Spring Framework :

          ?跟我學Spring3

          2.Spring MVC

          ?跟開濤學Spring MVC

          ?JSP語法、Spring Form、JSTL、EL

          ?Bean Validation

          3.Apache Shiro

          ?官方文檔

          ?快速入門

          4.SiteMesh 2.4

          ?官方文檔

          ?入門實例、標簽使用、裝飾文件

          5.Bootstrap 2.3

          ?Bootstrap官網

          ?Bootstrap中文網

          6.jQuery

          ?jQuery API:官方文檔 中文文檔

          ?jQuery Validation:官方文檔 使用范例

          ?jQuery zTree: 官方文檔

          ?jQruey jBox:官方文檔

          7.Activiti

          ?官方網站

          ?中文文檔

          ?咖啡兔Activiti

          8.Ehcache

          ?官方文檔

          ?EhCache分布式緩存

          9.其它資料

          ?Alibaba Druid

          ?FreeMarker

          ?

          8.安裝部署

          1.運行Maven目錄下的settings.bat文件,用來設置maven倉庫路徑,并按提示操作(設置PATH系統變量、配置Eclipse)。

          2.執行jeesite/bin/eclipse.bat 生成工程文件并下載jar依賴包(如果需要修改默認項目名,請打開pom.xml修改第7行artifactId,然后再執行eclipse.bat文件)。

          3.將 jeesite 工程導入到eclipse,選中工程,按F5刷新。

          4.設置數據源:src/main/resources/jeesite.properties

          5.導入數據表并初始化數據:運行db/init-db.bat文件。(導入時如果出現“drop”失敗提示信息,請忽略。)

          6.新建Server(Tomcat),注意選擇以下兩個選項:

          7.配置server.xml的Connector項,增加URIEncoding="UTF-8"

          8.部署到Tomcat,設置Auto Reload為Disabled。

          9.訪問工程:http://127.0.0.1:8080/ jeesite 用戶名:thinkgem 密碼:admin

          9.常見問題

          1.'mvn' 不是內部或外部命令,原因如下

          a)PATH未配置或配置了多個不一致的Maven地址,如用戶/系統變量。

          b)M2_HOME系統/用戶變量地址不正確,可刪除M2_HOME變量。

          c)檢查mvn運行是否正常,cmd執行:mvn -v

          2.運行eclipse.bat 找不到文件路徑或亂碼:一般原因是路徑中包含空格或中文。

          3.導入到eclipse下找不到jar包:maven未配置,查看m2_repo倉庫路徑是否正確。

          4.運行init-db.bat提示ORA-xxx:根據錯誤碼排除錯誤,一般是數據庫url不對,用戶名或密碼錯誤。

          5.部署時出現某某被鎖定,一般原因:Tomcat服務中的兩個選項未選中。

          6.字典列表,添加鍵值,出現亂碼:server.xml未配置url編碼為utf-8。

          管理功能

          內容管理

          內容發布

          概述

          · 欄目列表:以樹結構方式顯示網站整體設置的欄目,點擊在右側可管理當前欄目的信息。

          · 文章列表:當前欄目如果為文章模型的話,左側則顯示文章列表,如果為鏈接模型,左側則顯示鏈接列表。

          · 內容模型,包括:新聞文章、友情鏈接:

          1、 文章模型:對新聞、資料進行管理

          1) 強大的可視化內容在線編輯器:提供常用的內容排版工具條;Word內容直接復制,格式不亂;提供通用模板排版格式;圖片、Flash上傳及添加附件功能。

          2) 文件管理:提供上傳的照片、文件增刪功能。

          3) 關鍵字:提供文章關鍵字功能。

          4) 權重:提供文章排序功能,值越大越靠前。

          5) 縮略圖:文章縮略圖片。

          6) 相關文章:關聯相關文章。

          7) 推薦位:可推薦到首頁焦點圖、欄目文章推薦等。

          8) 發布時間:可修改發布時間。

          2、 鏈接模型:如友情鏈接內容。

          文章列表

          · 查詢:可通過欄目選擇,文章標題(模糊),文檔狀態查詢。

          · 欄目列:點擊后可快速進行查詢當前點擊的欄目。

          · 標題列:點擊后可會計進入文章查看或修改頁面。

          · 操作列:提供文章的操作;

          · 訪問:快速預覽發布后的頁面;

          · 修改:進行文章編輯修改

          · 刪除:刪除當前文章,刪除操作為邏輯刪除,刪除后在文章狀態刪除中可查詢到,可恢復。

          添加/修改文章

          · 歸屬欄目:該欄目下有子欄目的不能選擇。

          · 標題:必填項,文章標題,最長255個漢字;顏色:標題顏色。

          · 外部鏈接:如果當前文章不是本站文檔,可選擇"外部鏈接"設置外部鏈接地址,打開改文章時直接執行改地址。

          · 關鍵字:發布文章關鍵字信息,設置后顯示在頁面的關鍵字標簽里,錄入可提高搜索引擎優化排名。

          · 權重:設置文章的排列順序,數值越大越靠前;可通過"置頂"復選框快速設置權重為999;也可通過設置"過期時間"設置置頂時間,超過指定時間后,置頂自動失效,并設置為0;過期時間為空,表示不過期。

          · 摘要:文章的摘要信息,不超過255個漢字。

          · 縮略圖:提供文章圖片功能,如圖片新聞(438 × 268像素)等。

          · 正文:文章的正文,可視化在線編輯器,提供常用的內容排版工具條;Word內容直接復制,格式不亂;提供通用模板排版格式;圖片、Flash上傳及添加附件功能。

          · 添加圖片:可進行從服務器上瀏覽一副以前上傳的圖片,也可鏈接其它網站圖片,可以自己手動上傳一副圖片,操作界面如下:

          · 添加附件:可進行修改鏈接標題,可服務器上選擇或手動上傳(小于5M),同圖片,操作界面如下:

          · 來源:填寫文章的出處,來源等信息。

          · 相關文章:可選擇與該文章相關的文章,提供閱讀者進行延伸閱讀。

          · 發布狀態:文章的狀態(發布、審核、刪除),如果當前登錄無發布權限,則直接進入審核狀態,文章審核后才可進行正式發布。

          · 查看評論:如果當前為意見征集模塊,則可查看征集信息。

          發布信息審核

          審核需要審核的文章,如通知通告,有信息員發布后,管理員可通過此功能對信息進行審核發布。

          統計分析

          信息量統計

          統計一段時間內的信息發布量及點擊量。

          評論管理

          管理列表

          允許評論的文章,評論后需管理員進行審核后才能展示到頁面上。有該功能的人員可對待審核的評論進行審核操作。

          欄目管理

          概述

          樹形表格界面,可折疊;設置靈活,可隨意調整欄目父子關系;支持無限級子欄目;支持欄目排序;支持多種內容模型(文章模型、鏈接模型等),支持上傳欄目縮了圖;支持設置欄目描述及關鍵字,提升搜索引擎排行。

          1、 導航欄顯示:設置是否在網站主導航欄中顯示。

          2、 分類頁中顯示列表:是否在二級頁面中顯示內容列表。

          3、 展現方式:

          1) 默認方式:有子欄目,顯示子欄目內容列表;無子欄目,直接顯示該欄目的內容列表。

          2) 首欄目內容列表:顯示第一個子欄目的內容列表。

          3) 欄目第一條內容:顯示該欄目中的第一篇內容。

          列表

          添加、修改

          站點管理

          概述

          對站點進行維護,支持多站點發布,可設置站點標題、描述、關鍵字、版權信息、模板風格等。

          列表

          添加、修改

          站點切換

          當存在多站點發布的情況下,可通過該功能進行站點切換。

          公共留言

          概述

          留言管理:姓名、郵箱、單位、電話、留言分類(咨詢、建議、批評、其它)留言內容。

          列表

          審核

          網站開發步驟

          基礎數據維護

          1、 進入站點設置,并確定默認站點為當前站點。

          2、 進入欄目設置,給當前站點設置和維護欄目,維護完成可訪問:http://127.0.0.1:8080/jeesite/f 預覽站點。

          建立自己的主題

          1、 完成數據維護下一步開始新建站點主題風格,進入字典管理,給"內容管理-站點主題 | cms_theme"字典,增加一個主題。

          2、 進入站點設置,設置默認站點的:名稱、描述、版權、主題(剛建立的主題)、首頁視圖等信息。

          3、 復制 /src/main/webapp/WEB-INF/views/modules/cms/front/themes下的basic文件夾(為了對照方便,不要直接修改),重命名為自己設計的主題名稱(剛建立的主題,字典鍵值)。

          4、 到這里初始化工作基本完成,下一步開始編輯你的主題文件即可。

          主題模板介紹

          1、 首頁模板:frontIndex.jsp, 命名格式:frontIndex*.jsp

          2、 文章列表頁:frontList.jsp, 命名格式:frontList*.jsp

          3、 文章詳情頁:frontViewArticle.jsp,命名格式:frontViewArticle*.jsp

          4、 文章評論:frontComment.jsp

          5、 公眾留言:frontGuestbook.jsp

          6、 站點地圖:frontMap.jsp

          7、 站點搜索:frontSearch.jsp

          模板中的標簽可參看fnc.tld文件。具體用法可參看以上模板文件;使用它,你可以不用動后臺一處代碼,只需要修改你配置和模板文件,即可快速完成網站開發。

          14

          https://github.com/thinkgem/jeesite

          內容管理模塊

          功能說明

          ThinkGem

          2014年6月17日

          目錄1.管理功能31.1.內容管理31.1.1.內容發布31.1.2.統計分析81.1.3.評論管理81.1.4.欄目管理91.1.5.站點管理101.1.6.公共留言12

          管理功能

          內容管理

          內容發布

          概述

          · 欄目列表:以樹結構方式顯示網站整體設置的欄目,點擊在右側可管理當前欄目的信息。

          · 文章列表:當前欄目如果為文章模型的話,左側則顯示文章列表,如果為鏈接模型,左側則顯示鏈接列表。

          · 內容模型,包括:新聞文章、友情鏈接:

          1、 文章模型:對新聞、資料進行管理

          1) 強大的可視化內容在線編輯器:提供常用的內容排版工具條;Word內容直接復制,格式不亂;提供通用模板排版格式;圖片、Flash上傳及添加附件功能。

          2) 文件管理:提供上傳的照片、文件增刪功能。

          3) 關鍵字:提供文章關鍵字功能。

          4) 權重:提供文章排序功能,值越大越靠前。

          5) 縮略圖:文章縮略圖片。

          6) 相關文章:關聯相關文章。

          7) 推薦位:可推薦到首頁焦點圖、欄目文章推薦等。

          8) 發布時間:可修改發布時間。

          2、 鏈接模型:如友情鏈接內容。

          文章列表

          · 查詢:可通過欄目選擇,文章標題(模糊),文檔狀態查詢。

          · 欄目列:點擊后可快速進行查詢當前點擊的欄目。

          · 標題列:點擊后可會計進入文章查看或修改頁面。

          · 操作列:提供文章的操作;

          · 訪問:快速預覽發布后的頁面;

          · 修改:進行文章編輯修改

          · 刪除:刪除當前文章,刪除操作為邏輯刪除,刪除后在文章狀態刪除中可查詢到,可恢復。

          添加/修改文章

          · 歸屬欄目:該欄目下有子欄目的不能選擇。

          · 標題:必填項,文章標題,最長255個漢字;顏色:標題顏色。

          · 外部鏈接:如果當前文章不是本站文檔,可選擇"外部鏈接"設置外部鏈接地址,打開改文章時直接執行改地址。

          · 關鍵字:發布文章關鍵字信息,設置后顯示在頁面的關鍵字標簽里,錄入可提高搜索引擎優化排名。

          · 權重:設置文章的排列順序,數值越大越靠前;可通過"置頂"復選框快速設置權重為999;也可通過設置"過期時間"設置置頂時間,超過指定時間后,置頂自動失效,并設置為0;過期時間為空,表示不過期。

          · 摘要:文章的摘要信息,不超過255個漢字。

          · 縮略圖:提供文章圖片功能,如圖片新聞(438 × 268像素)等。

          · 正文:文章的正文,可視化在線編輯器,提供常用的內容排版工具條;Word內容直接復制,格式不亂;提供通用模板排版格式;圖片、Flash上傳及添加附件功能。

          · 添加圖片:可進行從服務器上瀏覽一副以前上傳的圖片,也可鏈接其它網站圖片,可以自己手動上傳一副圖片,操作界面如下:

          · 添加附件:可進行修改鏈接標題,可服務器上選擇或手動上傳(小于5M),同圖片,操作界面如下:

          · 來源:填寫文章的出處,來源等信息。

          · 相關文章:可選擇與該文章相關的文章,提供閱讀者進行延伸閱讀。

          · 發布狀態:文章的狀態(發布、審核、刪除),如果當前登錄無發布權限,則直接進入審核狀態,文章審核后才可進行正式發布。

          · 查看評論:如果當前為意見征集模塊,則可查看征集信息。

          發布信息審核

          審核需要審核的文章,如通知通告,有信息員發布后,管理員可通過此功能對信息進行審核發布。

          統計分析

          信息量統計

          統計一段時間內的信息發布量及點擊量。

          評論管理

          管理列表

          允許評論的文章,評論后需管理員進行審核后才能展示到頁面上。有該功能的人員可對待審核的評論進行審核操作。

          欄目管理

          概述

          樹形表格界面,可折疊;設置靈活,可隨意調整欄目父子關系;支持無限級子欄目;支持欄目排序;支持多種內容模型(文章模型、鏈接模型等),支持上傳欄目縮了圖;支持設置欄目描述及關鍵字,提升搜索引擎排行。

          1、 導航欄顯示:設置是否在網站主導航欄中顯示。

          2、 分類頁中顯示列表:是否在二級頁面中顯示內容列表。

          3、 展現方式:

          1) 默認方式:有子欄目,顯示子欄目內容列表;無子欄目,直接顯示該欄目的內容列表。

          2) 首欄目內容列表:顯示第一個子欄目的內容列表。

          3) 欄目第一條內容:顯示該欄目中的第一篇內容。

          列表

          添加、修改

          站點管理

          概述

          對站點進行維護,支持多站點發布,可設置站點標題、描述、關鍵字、版權信息、模板風格等。

          列表

          添加、修改

          站點切換

          當存在多站點發布的情況下,可通過該功能進行站點切換。

          公共留言

          概述

          留言管理:姓名、郵箱、單位、電話、留言分類(咨詢、建議、批評、其它)留言內容。

          列表

          審核

          網站開發步驟

          基礎數據維護

          1、 進入站點設置,并確定默認站點為當前站點。

          2、 進入欄目設置,給當前站點設置和維護欄目,維護完成可訪問:http://127.0.0.1:8080/jeesite/f 預覽站點。

          建立自己的主題

          1、 完成數據維護下一步開始新建站點主題風格,進入字典管理,給"內容管理-站點主題 | cms_theme"字典,增加一個主題。

          2、 進入站點設置,設置默認站點的:名稱、描述、版權、主題(剛建立的主題)、首頁視圖等信息。

          3、 復制 /src/main/webapp/WEB-INF/views/modules/cms/front/themes下的basic文件夾(為了對照方便,不要直接修改),重命名為自己設計的主題名稱(剛建立的主題,字典鍵值)。

          4、 到這里初始化工作基本完成,下一步開始編輯你的主題文件即可。

          主題模板介紹

          1、 首頁模板:frontIndex.jsp, 命名格式:frontIndex*.jsp

          2、 文章列表頁:frontList.jsp, 命名格式:frontList*.jsp

          3、 文章詳情頁:frontViewArticle.jsp,命名格式:frontViewArticle*.jsp

          4、 文章評論:frontComment.jsp

          5、 公眾留言:frontGuestbook.jsp

          6、 站點地圖:frontMap.jsp

          7、 站點搜索:frontSearch.jsp

          模板中的標簽可參看fnc.tld文件。具體用法可參看以上模板文件;使用它,你可以不用動后臺一處代碼,只需要修改你配置和模板文件,即可快速完成網站開發。

          必須先轉發,轉發,轉發,加“大數據java架構師”關注,然后私信

          “jeesite”即可免費獲取源碼下載地址

          者 | 天元浪子

          責編 | 伍杏玲

          出品 | CSDN 博客

          【CSDN 編者按】OpenGL(開放式圖形庫),用于渲染 2D、3D 矢量圖形的跨語言、跨平臺的應用程序編程接口,C、C++、Python、Java等語言都能支持 OpenGL。本文作者以 Python 語法為例,用兩萬字詳解 OpenGL 的理論知識、用法與實際操作,干貨滿滿,一起來看看吧。

          預備知識

          OpenGL 是 Open Graphics Library 的簡寫,意為“開放式圖形庫”,是用于渲染 2D、3D 矢量圖形的跨語言、跨平臺的應用程序編程接口(API)。OpenGL 不是一個獨立的平臺,因此,它需要借助于一種編程語言才能被使用。C / C++ / Python / Java 都可以很好支持 OpengGL,我當然習慣性選擇 Python 語言。

          如果讀者是 Python 程序員,并且了解 NumPy,接下來的閱讀應該不會有任何障礙;否則,我建議先花半小時學習一下 Python 語言。關于 Python ,可以參考我的另一篇博文《數學建模三劍客MSN》。事實上,我覺得 Python 語言近乎于自然語言,只要讀者是程序員,即便不熟悉 Python ,讀起來也不會有多大問題。

          另外,讀者也不必擔心數學問題。使用 OpenGL 不需要具備多么高深的數學水平,只要能輔導初中學生的數學作業,就足夠用了。

          一、坐標系

          在 OpenGL 的世界里,有各式各樣的坐標系。隨著對 OpenGL 概念的理解,我們至少會接觸到六種坐標系,而初始只需要了解其中的三個就足夠用了(第一次閱讀這段話的時候,只需要了解世界坐標系就可以了)。

          • 世界坐標系(World Coordinates)

          世界坐標系是右手坐標系,以屏幕中心為原點(0, 0, 0),且是始終不變的。

          • 視點坐標系(Eye or Camera Coordinates)

          視點坐標是以視點為原點,以視線的方向為Z+軸正方向的坐標系。OpenGL 管道會將世界坐標先變換到視點坐標,然后進行裁剪,只有在視線范圍(視景體)之內的場景才會進入下一階段的計算。

          • 屏幕坐標系(Window or Screen Coordinates)

          OpenGL 的重要功能之一就是將三維的世界坐標經過變換、投影等計算,最終算出它在顯示設備上對應的位置,這個位置就稱為設備坐標。在屏幕、打印機等設備上的坐標是二維坐標。值得一提的是,OpenGL 可以只使用設備的一部分進行繪制,這個部分稱為視區或視口(viewport)。投影得到的是視區內的坐標(投影坐標),從投影坐標到設備坐標的計算過程就是設備變換了。

          二、投影

          三維場景中的物體最終都會顯示在類似屏幕這樣的二維觀察平面上。將三維物體變為二維圖形的變換成為投影變換。最常用的投影有兩種:平行投影和透視投影。如下圖所示,F 是投影面,p1p2 為三維空間中的一條直線,p’1 和 p’2 分別是 p1 和 p2 在 F 上的投影,虛線表示投影線,O 為投影中心。

          • 平行投影

          這里所說的平行投影,特指正交平行投影——投影線垂直于投影面。將一個三維點 (x,y,z) 正交平行投影到 xoy 平面上,則投影點坐標為 (x,y,0)。由于平行投影丟棄了深度信息,所以無法產生真實感,但可以保持物體之間相對大小關系不變。

          • 透視投影

          透視投影將投影面置于觀察點和投影對象之間,距離觀察者越遠的物體,投影尺寸越小,投影效果具有真實感,常用于游戲和仿真領域。

          三、視景體

          無論是平行投影還是透視投影,投影成像都是在投影面上——我們可以把投影面理解成顯示屏幕。世界坐標系描述的三維空間是無限的,投影平面是無限的,但(我們能夠看到的)屏幕面積總是有限的,因此在投影變換時,通常只處理能夠顯示在屏幕上的那一部分三維空間。從無限三維空間中裁切出來的可以顯示在屏幕上的部分三維空間,我們稱之為視景體。視景體有六個面,分別是左右上下和前后面。

          對于平行投影而言,視景體是一個矩形平行六面體;對于透視投影來說,視景體是一個棱臺。理解這一點并不難:因為越遠處的物體在投影窗口的透視投影越小,也就意味著填滿投影窗口需要更大的體量,視景體自然就變成了棱臺。

          四、視口

          對于平行投影而言,視口就是由視景體的左右上下四個面圍成的矩形,對于透視投影來說,視口就是視景體的前截面在投影窗口上的透視投影。

          視口是 OpenGL 中比較重要的概念,現階段可以簡單理解成屏幕(或其他輸出設備)。事實上,視口和屏幕是相關但又不相同的,屏幕有固定的寬高比,而視口大小可以由用戶自行定義。通常,為了適應不同寬高比的屏幕,在設置視口時,會根據屏幕寬高比調整視景體(增加寬度或高度)。

          五、視點

          現實生活中,人們看到的三維空間物體的樣子取決于觀察者站在什么角度去看。這里面包含著三個概念:

          • 觀察者的位置:眼睛在哪兒?

          • 觀察者的姿勢:站立還是倒立?左側臥還是右側臥?

          • 觀察對象:眼睛盯著哪里?

          對應在 OpenGL 中,也有同樣的概念,即視點的位置、瞄準方向的參考點,以及(向上的)方向。

          六、OpenGL 變換

          下圖是三維圖形的顯示流程。世界坐標系中的三維物體經過視點變換和一系列幾何變換(平移、旋轉、縮放)之后,坐標系變換為視點坐標系;經過投影和裁剪之后,坐標系變換為歸一化設備坐標系;最后經過視口變換顯示在屏幕上,相應地,坐標系變成了窗口坐標系。

          • 視點變換:相當于設置視點的位置和方向

          • 模型變換:包括平移、旋轉、縮放等三種類型

          • 裁剪變換:根據視景體定義的六個面(和附加裁剪面)對三維空間裁剪

          • 視口變換:將視景體內投影的物體顯示在二維的視口平面上

          安裝 PyOpenGL

          如果想當然地使用 pip 如下所示安裝,可能會有一些麻煩。

          pip install pyopengl

          當我這樣安裝之后,運行 OpenGL 代碼,得到了這樣的錯誤信息:

          FunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling

          原來,pip 默認安裝的是32位版本的PyOpenGL,而我的操作系統是64位的。建議點擊這里下載適合自己的版本,直接安裝.whl文件。我是這樣安裝的:

          pip install PyOpenGL-3.1.3b2-cp37-cp37m-win_amd64.whl

          OpenGL 庫及函數簡介

          我第一次接觸 OpenGL 的 GL / GLU / GLUT 的時候,一下就被這些長得像孿生兄弟的庫名字給整懵圈了,要不是內心強大,也許就跟 OpenGL 說再見了。時間久了才發現,OpenGL 的庫及函數命名規則非常合理,便于查找、記憶:

          OpenGL函數的命名格式如下:

          <庫前綴><根命令><可選的參數個數><可選的參數類型>

          常見的庫前綴有 gl、glu、glut、aux、wgl、glx、agl 等。庫前綴表示該函數屬于 OpenGL 哪一個開發庫。從函數名后面中還可以看出需要多少個參數以及參數的類型。I 代表 int 型,f 代表 float 型,d 代表 double 型,u 代表無符號整型。例如 glColor3f 表示了該函數屬于gl庫,參數是三個浮點數。

          OpenGL 函數庫相關的 API 有核心庫(gl)、實用庫(glu)、實用工具庫(glut)、輔助庫(aux)、窗口庫(glx、agl、wgl)和擴展函數庫等。gl是核心,glu是對gl的部分封裝。glut是為跨平臺的OpenGL程序的工具包,比aux功能強大。glx、agl、wgl 是針對不同窗口系統的函數。擴展函數庫是硬件廠商為實現硬件更新利用OpenGL的擴展機制開發的函數。本文僅對常用的四個庫做簡單介紹。

          一、OpenGL 核心庫 GL

          核心庫包含有115個函數,函數名的前綴為gl。這部分函數用于常規的、核心的圖形處理。此函數由gl.dll來負責解釋執行。由于許多函數可以接收不同數以下幾類。據類型的參數,因此派生出來的函數原形多達300多個。核心庫中的函數主要可以分為以下幾類函數:

          • 繪制基本幾何圖元的函數:

            glBegain、glEnd、glNormal*、glVertex*

          • 矩陣操作、幾何變換和投影變換的函數:

            如矩陣入棧函數glPushMatrix,矩陣出棧函數glPopMatrix,裝載矩陣函數glLoadMatrix,矩陣相乘函數glMultMatrix,當前矩陣函數glMatrixMode和矩陣標準化函數glLoadIdentity,幾何變換函數glTranslate*、glRotate*和glScale*,投影變換函數glOrtho、glFrustum和視口變換函數glViewport

          • 顏色、光照和材質的函數:

            如設置顏色模式函數glColor*、glIndex*,設置光照效果的函數glLight* 、glLightModel*和設置材質效果函數glMaterial

          • 顯示列表函數:

            主要有創建、結束、生成、刪除和調用顯示列表的函數glNewList、glEndList、glGenLists、glCallList和glDeleteLists

          • 紋理映射函數:

            主要有一維紋理函數glTexImage1D、二維紋理函數glTexImage2D、設置紋理參數、紋理環境和紋理坐標的函數glTexParameter*、glTexEnv*和glTetCoord*

          • 特殊效果函數:

            融合函數glBlendFunc、反走樣函數glHint和霧化效果glFog*

          • 光柵化、象素操作函數:

            如象素位置glRasterPos*、線型寬度glLineWidth、多邊形繪制模式glPolygonMode,讀取象素glReadPixel、復制象素glCopyPixel

          • 選擇與反饋函數:

            主要有渲染模式glRenderMode、選擇緩沖區glSelectBuffer和反饋緩沖區glFeedbackBuffer

          • 曲線與曲面的繪制函數:

            生成曲線或曲面的函數glMap*、glMapGrid*,求值器的函數glEvalCoord* glEvalMesh*

          • 狀態設置與查詢函數:

            glGet*、glEnable、glGetError

          二、OpenGL 實用庫 GLU

          包含有43個函數,函數名的前綴為glu。OpenGL提供了強大的但是為數不多的繪圖命令,所有較復雜的繪圖都必須從點、線、面開始。Glu 為了減輕繁重的編程工作,封裝了OpenGL函數,Glu函數通過調用核心庫的函數,為開發者提供相對簡單的用法,實現一些較為復雜的操作。此函數由glu.dll來負責解釋執行。OpenGL中的核心庫和實用庫可以在所有的OpenGL平臺上運行。主要包括了以下幾種:

          • 輔助紋理貼圖函數:

            gluScaleImage 、gluBuild1Dmipmaps、gluBuild2Dmipmaps

          • 坐標轉換和投影變換函數:

            定義投影方式函數gluPerspective、gluOrtho2D 、gluLookAt,拾取投影視景體函數gluPickMatrix,投影矩陣計算gluProject和gluUnProject

          • 多邊形鑲嵌工具:

            gluNewTess、gluDeleteTess、gluTessCallback、gluBeginPolygon、gluTessVertex、gluNextContour、gluEndPolygon

          • 二次曲面繪制工具:

            主要有繪制球面、錐面、柱面、圓環面gluNewQuadric、gluSphere、gluCylinder、gluDisk、gluPartialDisk、gluDeleteQuadric

          • 非均勻有理B樣條繪制工具:

            主要用來定義和繪制Nurbs曲線和曲面,包括gluNewNurbsRenderer、gluNurbsCurve、gluBeginSurface、gluEndSurface、gluBeginCurve、gluNurbsProperty

          • 錯誤反饋工具:

            獲取出錯信息的字符串gluErrorString

          三、OpenGL 工具庫 GLUT

          包含大約30多個函數,函數名前綴為glut。glut是不依賴于窗口平臺的OpenGL工具包,由Mark KLilgrad在SGI編寫(現在在Nvidia),目的是隱藏不同窗口平臺API的復雜度。函數以glut開頭,它們作為aux庫功能更強的替代品,提供更為復雜的繪制功能,此函數由glut.dll來負責解釋執行。

          由于glut中的窗口管理函數是不依賴于運行環境的,因此OpenGL中的工具庫可以在X-Window、Windows NT、OS/2等系統下運行,特別適合于開發不需要復雜界面的OpenGL示例程序。對于有經驗的程序員來說,一般先用glut理順3D圖形代碼,然后再集成為完整的應用程序。這部分函數主要包括:

          • 窗口操作函數:

            窗口初始化、窗口大小、窗口位置函數等 glutInit、glutInitDisplayMode、glutInitWindowSize、glutInitWindowPosition

          • 回調函數:

            響應刷新消息、鍵盤消息、鼠標消息、定時器函數 GlutDisplayFunc、glutPostRedisplay、glutReshapeFunc、glutTimerFunc、glutKeyboardFunc、glutMouseFunc

          • 創建復雜的三維物體:

            這些和aux庫的函數功能相同。

          • 菜單函數:

            創建添加菜單的函數 GlutCreateMenu、glutSetMenu、glutAddMenuEntry、glutAddSubMenu 和 glutAttachMenu

          • 程序運行函數:

            glutMainLoop

          四、Windows 專用庫 WGL

          針對Windows平臺的擴展,包含有16個函數,函數名前綴為wgl。這部分函數主要用于連接OpenGL和Windows ,以彌補OpenGL在文本方面的不足。Windows專用庫只能用于Windows環境中。這類函數主要包括以下幾類:

          • 繪圖上下文相關函數:

            wglCreateContext、wglDeleteContext、wglGetCurrentContent、wglGetCurrentDC、wglDeleteContent

          • 文字和文本處理函數:

            wglUseFontBitmaps、wglUseFontOutlines

          • 覆蓋層、地層和主平面層處理函數:

            wglCopyContext、wglCreateLayerPlane、wglDescribeLayerPlane、wglReakizeLayerPlatte

          • 其他函數:

            wglShareLists、wglGetProcAddress

          開始 OpenGL 的奇幻之旅

          一、OpenGL 基本圖形的繪制

          • 設置顏色

          設置顏色的函數有幾十個,都是以 glColor 開頭,后面跟著參數個數和參數類型。參數可以是 0 到 255 之間的無符號整數,也可以是 0 到 1 之間的浮點數。三個參數分別表示 RGB 分量,第四個參數表示透明度(其實叫不透明度更恰當)。以下最常用的兩個設置顏色的方法:

          glColor3f(1.0,0.0,0.0) # 設置當前顏色為紅色

          glColor4f(0.0,1.0,1.0,1.0) # 設置當前顏色為青色,不透明度

          glColor3ub(0, 0, 255) # 設置當前顏色為藍色

          glColor 也支持將三個或四個參數以向量方式傳遞,例如:

          glColor3fv([0.0,1.0,0.0]) # 設置當前顏色為綠色

          特別提示:OpenGL 是使用狀態機模式,顏色是一個狀態變量,設置顏色就是改變這個狀態變量并一直生效,直到再次調用設置顏色的函數。除了顏色,OpenGL 還有很多的狀態變量或模式。在任何時間,都可以查詢每個狀態變量的當前值,還可以用 glPushAttrib 或 glPushClientAttrib 把狀態變量的集合保存起來,必要的時候,再用 glPopAttrib 或 glPopClientAttrib 恢復狀態變量。

          • 設置頂點

          頂點(vertex)是 OpengGL 中非常重要的概念,描述線段、多邊形都離不開頂點。和設置顏色類似,設置頂點的函數也有幾十個,都是以 glVertex 開頭,后面跟著參數個數和參數類型,同樣也支持將多個以向量方式傳遞。兩個參數的話,分別表示 xy 坐標,三個參數則分別表示 xyz 坐標。如有第四個參數,則表示該點的齊次坐標 w;否則,默認 w=1。至于什么是齊次坐標,顯然超出了初中數學的范疇,在此不做探討。

          glVertex2f(1.0,0.5) # xoy平面上的點,z=0

          glVertex3f(0.5,1.0,0.0) # 三維空間中的點

          • 繪制基本圖形

          僅僅設置顏色和頂點,并不能畫出來什么。我們可以在任何時候改變顏色,但所有的頂點設置,都必須包含在 glBegin 和 glEnd 之間,而 glBegin 的參數則指定了將這些頂點畫成什么。以下是 glBegin 可能的參數選項:

          二、第一個 OpenGL 程序

          通常,我們使用工具庫(GLUT)創建 OpenGL 應用程序。為啥不用 GL 或者 GLU 庫呢?畫畫之前總得先有一塊畫布吧,不能直接拿起畫筆就開畫。前文說過,工具庫主要提供窗口相關的函數,有了窗口,就相當于有了畫布,而核心庫和實用庫,就好比各式各樣的畫筆、顏料。使用工具庫(GLUT)創建 OpenGL 應用程序只需要四步(當然,前提是你需要先準備好繪圖函數,并給它取一個合適的名字):

          • 初始化glut庫

          • 創建glut窗口

          • 注冊繪圖的回調函數

          • 進入glut主循環

          OK,鋪墊了這么多之后,我們終于開始第一個 OpenGL 應用程序了:繪制三維空間的世界坐標系,在坐標原點的后方(z軸的負半區)畫一個三角形。代碼如下:

          # -*- coding: utf-8 -*-

          # -------------------------------------------

          # quidam_01.py 三維空間的世界坐標系和三角形

          # -------------------------------------------

          from OpenGL.GL import *

          from OpenGL.GLUT import *

          def draw:

          # ---------------------------------------------------------------

          glBegin(GL_LINES) # 開始繪制線段(世界坐標系)

          # 以紅色繪制x軸

          glColor4f(1.0, 0.0, 0.0, 1.0) # 設置當前顏色為紅色不透明

          glVertex3f(-0.8, 0.0, 0.0) # 設置x軸頂點(x軸負方向)

          glVertex3f(0.8, 0.0, 0.0) # 設置x軸頂點(x軸正方向)

          # 以綠色繪制y軸

          glColor4f(0.0, 1.0, 0.0, 1.0) # 設置當前顏色為綠色不透明

          glVertex3f(0.0, -0.8, 0.0) # 設置y軸頂點(y軸負方向)

          glVertex3f(0.0, 0.8, 0.0) # 設置y軸頂點(y軸正方向)

          # 以藍色繪制z軸

          glColor4f(0.0, 0.0, 1.0, 1.0) # 設置當前顏色為藍色不透明

          glVertex3f(0.0, 0.0, -0.8) # 設置z軸頂點(z軸負方向)

          glVertex3f(0.0, 0.0, 0.8) # 設置z軸頂點(z軸正方向)

          glEnd # 結束繪制線段

          # ---------------------------------------------------------------

          glBegin(GL_TRIANGLES) # 開始繪制三角形(z軸負半區)

          glColor4f(1.0, 0.0, 0.0, 1.0) # 設置當前顏色為紅色不透明

          glVertex3f(-0.5, -0.366, -0.5) # 設置三角形頂點

          glColor4f(0.0, 1.0, 0.0, 1.0) # 設置當前顏色為綠色不透明

          glVertex3f(0.5, -0.366, -0.5) # 設置三角形頂點

          glColor4f(0.0, 0.0, 1.0, 1.0) # 設置當前顏色為藍色不透明

          glVertex3f(0.0, 0.5, -0.5) # 設置三角形頂點

          glEnd

          # 結束繪制三角形

          # ---------------------------------------------------------------

          glFlush # 清空緩沖區,將指令送往硬件立即執行

          if __name__ == "__main__":

          glutInit # 1. 初始化glut庫

          glutCreateWindow('Quidam Of OpenGL') # 2. 創建glut窗口

          glutDisplayFunc(draw) # 3. 注冊回調函數draw

          glutMainLoop # 4. 進入glut主循環

          運行代碼,我這里顯示結果如下面左圖所示。如果嘗試運行這段代碼出錯的話,我猜應該是 PyOpenGL 安裝出現了問題,建議返回到前面重讀 PyOpenGL 的安裝。

          短暫的激動之后,你可能會嘗試畫一些其他的線段,變換顏色或者透明度,甚至繪制多邊形。很快你會發現,我們的第一個程序有很多問題,比如:

          1. 窗口的標題不能使用中文,否則會顯示亂碼

          2. 窗口的初始大小和位置無法改變

          3. 改變窗口的寬高比,三角形寬高比也會改變(如上面右圖所示)

          4. 三角形不應該遮擋坐標軸

          5. 改變顏色的透明度無效

          6. 不能縮放旋轉

          沒關系,除了第1個問題我不知道怎么解決(貌似無解),其他問題都不是事兒。和我們的代碼相比,一個真正實用的 OpenGL 程序,還有許多工作要做:

          • 設置初始顯示模式

          • 初始化畫布

          • 繪圖函數里面需要增加:清除屏幕及深度緩存、投影設置、模型試圖設置

          • 綁定鼠標鍵盤的事件函數

          三、設置初始顯示模式

          初始化 glut 庫的時候,我們一般都要用 glutInitDisplayMode 來設置初始的顯示模式,它的參數可以是下表中參數的組合。

          使用雙緩存窗口,可以避免重繪時產生抖動的感覺。我一般選擇 GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH 作為參數來設置初始的顯示模式。

          四、初始化畫布

          開始繪圖之前,需要對畫布做一些初始化工作,這些工作只需要做一次。比如:

          glClearColor(0.0, 0.0, 0.0, 1.0) # 設置畫布背景色。注意:這里必須是4個參數

          glEnable(GL_DEPTH_TEST) # 開啟深度測試,實現遮擋關系

          glDepthFunc(GL_LEQUAL) # 設置深度測試函數(GL_LEQUAL只是選項之一)

          如有必要,還可以開啟失真校正(反走樣)、開啟表面剔除等。

          五、清除屏幕及深度緩存

          每次重繪之前,需要先清除屏幕及深度緩存。這項操作一般放在繪圖函數的開頭。

          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

          六、設置投影

          投影設置也是每次重繪都需要的步驟之一。glOrtho 用來設置平行投影,glFrustum 用來設置透視投影。這兩個函數的參數相同,都是視景體的 left / right / bottom / top / near / far 六個面。

          視景體的 left / right / bottom / top 四個面圍成的矩形,就是視口。near 就是投影面,其值是投影面距離視點的距離,far 是視景體的后截面,其值是后截面距離視點的距離。far 和 near 的差值,就是視景體的深度。視點和視景體的相對位置關系是固定的,視點移動時,視景體也隨之移動。

          我個人認為,視景體是 OpengGL 最重要、最核心的概念,它和視口、視點、投影面、縮放、漫游等概念密切關聯。只有正確理解了視景體,才能正確設置它的六個參數,才能呈現出我們期望的效果。

          為了在窗口寬高比改變時,繪制的對象仍然保持固定的寬高比,一般在做投影變換時,需要根據窗口的寬高比適當調整視景體的 left / right 或者 bottom / top 參數。

          假設 view 是視景體,width 和 height 是窗口的寬度和高度,在投影變換之前,需要先聲明是對投影矩陣的操作,并將投影矩陣單位化:

          glMatrixMode(GL_PROJECTION)

          glLoadIdentity

          if width > height:

          k = width / height

          glFrustum(view [0]*k, view [1]*k, view [2], view [3], view [4], view [5])

          else:

          k = height / width

          glFrustum(view [0], view [1], view [2]*k, view [3]*k, view [4], view [5])

          七、設置視點

          視點是和視景體關聯的概念。設置視點需要考慮眼睛在哪兒、看哪兒、頭頂朝哪兒,分別對應著eye、lookat 和 eye_up 三個向量。

          gluLookAt(

          eye[0], eye[1], eye[2],

          look_at[0], look_at[1], look_at[2],

          eye_up[0], eye_up[1], eye_up[2]

          )

          八、設置視口

          視口也是和視景體關聯的概念,相對簡單一點。

          glViewport(0, 0, width, height)

          九、設置模型視圖

          模型平移、旋轉、縮放等幾何變換,需要切換到模型矩陣:

          glMatrixMode(GL_MODELVIEW)

          glLoadIdentity

          glScale(1.0, 1.0, 1.0)

          十、捕捉鼠標事件、鍵盤事件和窗口事件

          GLUT 庫提供了幾個函數幫我們捕捉鼠標事件、鍵盤事件和窗口事件:

          • glutMouseFunc

            該函數捕捉鼠標點擊和滾輪操作,返回4個參數給被綁定的事件函數:鍵(左鍵/右鍵/中鍵/滾輪上/滾輪下)、狀態(1/0)、x坐標、y坐標

          • glutMotionFunc

            該函數捕捉有一個鼠標鍵被按下時的鼠標移動給被綁定的事件函數,返回2個參數:x坐標、y坐標

          • glutPassiveMotionFunc

            該函數捕捉鼠標移動,返回2個參數給被綁定的事件函數:x坐標、y坐標

          • glutEntryFunc

            該函數捕捉鼠標離開或進入窗口區域,返回1個參數給被綁定的事件函數:GLUT_LEFT 或者 GLUT_ENTERED

            glutKeyboardFunc(keydown)

            該函數捕捉鍵盤按鍵被按下,返回3個參數給被綁定的事件函數:被按下的鍵,x坐標、y坐標

          • glutReshapeFunc

            該函數捕捉窗口被改變大小,返回2個參數給被綁定的事件函數:窗口寬度、窗口高度

          如果我們需要捕捉這些事件,只需要定義事件函數,注冊相應的函數就行:

          def reshape(width, height):

          pass

          def mouseclick(button, state, x, y):

          pass

          def mousemotion(x, y):

          pass

          def keydown(key, x, y):

          pass

          glutReshapeFunc(reshape) # 注冊響應窗口改變的函數reshape

          glutMouseFunc(mouseclick) # 注冊響應鼠標點擊的函數mouseclick

          glutMotionFunc(mousemotion) # 注冊響應鼠標拖拽的函數mousemotion

          glutKeyboardFunc(keydown) # 注冊鍵盤輸入的函數keydown

          十一、綜合應用

          是時候把我們上面講的這些東西完整的演示一下了。下面的代碼還是畫了世界坐標系,并在原點前后各畫了一個三角形。鼠標可以拖拽視點繞參考點旋轉(二者距離保持不變),滾輪可以縮放模型。

          敲擊退格鍵或回車鍵可以讓視點遠離或接近參考點。敲擊 x/y/z 可以減小參考點對應的坐標值,敲擊 X/Y/Z 可以增大參考點對應的坐標值。敲擊空格鍵可以切換投影模式。

          上圖左是平行投影模式的顯示效果,上圖右是透視投影模式的顯示效果。代碼如下:

          # -*- coding: utf-8 -*-

          # -------------------------------------------

          # quidam_02.py 旋轉、縮放、改變視點和參考點

          # -------------------------------------------

          from OpenGL.GL import *

          from OpenGL.GLU import *

          from OpenGL.GLUT import *

          import numpy as np

          IS_PERSPECTIVE = True # 透視投影

          VIEW = np.array([-0.8, 0.8, -0.8, 0.8, 1.0, 20.0]) # 視景體的left/right/bottom/top/near/far六個面

          SCALE_K = np.array([1.0, 1.0, 1.0]) # 模型縮放比例

          EYE = np.array([0.0, 0.0, 2.0]) # 眼睛的位置(默認z軸的正方向)

          LOOK_AT = np.array([0.0, 0.0, 0.0]) # 瞄準方向的參考點(默認在坐標原點)

          EYE_UP = np.array([0.0, 1.0, 0.0]) # 定義對觀察者而言的上方(默認y軸的正方向)

          WIN_W, WIN_H = 640, 480 # 保存窗口寬度和高度的變量

          LEFT_IS_DOWNED = False # 鼠標左鍵被按下

          MOUSE_X, MOUSE_Y = 0, 0 # 考察鼠標位移量時保存的起始位置

          def getposture:

          global EYE, LOOK_AT

          dist = np.sqrt(np.power((EYE-LOOK_AT), 2).sum)

          if dist > 0:

          phi = np.arcsin((EYE[1]-LOOK_AT[1])/dist)

          theta = np.arcsin((EYE[0]-LOOK_AT[0])/(dist*np.cos(phi)))

          else:

          phi = 0.0

          theta = 0.0

          return dist, phi, theta

          DIST, PHI, THETA = getposture # 眼睛與觀察目標之間的距離、仰角、方位角

          def init:

          glClearColor(0.0, 0.0, 0.0, 1.0) # 設置畫布背景色。注意:這里必須是4個參數

          glEnable(GL_DEPTH_TEST) # 開啟深度測試,實現遮擋關系

          glDepthFunc(GL_LEQUAL) # 設置深度測試函數(GL_LEQUAL只是選項之一)

          def draw:

          global IS_PERSPECTIVE, VIEW

          global EYE, LOOK_AT, EYE_UP

          global SCALE_K

          global WIN_W, WIN_H

          # 清除屏幕及深度緩存

          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

          # 設置投影(透視投影)

          glMatrixMode(GL_PROJECTION)

          glLoadIdentity

          if WIN_W > WIN_H:

          if IS_PERSPECTIVE:

          glFrustum(VIEW[0]*WIN_W/WIN_H, VIEW[1]*WIN_W/WIN_H, VIEW[2], VIEW[3], VIEW[4], VIEW[5])

          else:

          glOrtho(VIEW[0]*WIN_W/WIN_H, VIEW[1]*WIN_W/WIN_H, VIEW[2], VIEW[3], VIEW[4], VIEW[5])

          else:

          if IS_PERSPECTIVE:

          glFrustum(VIEW[0], VIEW[1], VIEW[2]*WIN_H/WIN_W, VIEW[3]*WIN_H/WIN_W, VIEW[4], VIEW[5])

          else:

          glOrtho(VIEW[0], VIEW[1], VIEW[2]*WIN_H/WIN_W, VIEW[3]*WIN_H/WIN_W, VIEW[4], VIEW[5])

          # 設置模型視圖

          glMatrixMode(GL_MODELVIEW)

          glLoadIdentity

          # 幾何變換

          glScale(SCALE_K[0], SCALE_K[1], SCALE_K[2])

          # 設置視點

          gluLookAt(

          EYE[0], EYE[1], EYE[2],

          LOOK_AT[0], LOOK_AT[1], LOOK_AT[2],

          EYE_UP[0], EYE_UP[1], EYE_UP[2]

          )

          # 設置視口

          glViewport(0, 0, WIN_W, WIN_H)

          # ---------------------------------------------------------------

          glBegin(GL_LINES) # 開始繪制線段(世界坐標系)

          # 以紅色繪制x軸

          glColor4f(1.0, 0.0, 0.0, 1.0) # 設置當前顏色為紅色不透明

          glVertex3f(-0.8, 0.0, 0.0) # 設置x軸頂點(x軸負方向)

          glVertex3f(0.8, 0.0, 0.0) # 設置x軸頂點(x軸正方向)

          # 以綠色繪制y軸

          glColor4f(0.0, 1.0, 0.0, 1.0) # 設置當前顏色為綠色不透明

          glVertex3f(0.0, -0.8, 0.0) # 設置y軸頂點(y軸負方向)

          glVertex3f(0.0, 0.8, 0.0) # 設置y軸頂點(y軸正方向)

          # 以藍色繪制z軸

          glColor4f(0.0, 0.0, 1.0, 1.0) # 設置當前顏色為藍色不透明

          glVertex3f(0.0, 0.0, -0.8) # 設置z軸頂點(z軸負方向)

          glVertex3f(0.0, 0.0, 0.8) # 設置z軸頂點(z軸正方向)

          glEnd # 結束繪制線段

          # ---------------------------------------------------------------

          glBegin(GL_TRIANGLES) # 開始繪制三角形(z軸負半區)

          glColor4f(1.0, 0.0, 0.0, 1.0) # 設置當前顏色為紅色不透明

          glVertex3f(-0.5, -0.366, -0.5) # 設置三角形頂點

          glColor4f(0.0, 1.0, 0.0, 1.0) # 設置當前顏色為綠色不透明

          glVertex3f(0.5, -0.366, -0.5) # 設置三角形頂點

          glColor4f(0.0, 0.0, 1.0, 1.0) # 設置當前顏色為藍色不透明

          glVertex3f(0.0, 0.5, -0.5) # 設置三角形頂點

          glEnd # 結束繪制三角形

          # ---------------------------------------------------------------

          glBegin(GL_TRIANGLES) # 開始繪制三角形(z軸正半區)

          glColor4f(1.0, 0.0, 0.0, 1.0) # 設置當前顏色為紅色不透明

          glVertex3f(-0.5, 0.5, 0.5) # 設置三角形頂點

          glColor4f(0.0, 1.0, 0.0, 1.0) # 設置當前顏色為綠色不透明

          glVertex3f(0.5, 0.5, 0.5) # 設置三角形頂點

          glColor4f(0.0, 0.0, 1.0, 1.0) # 設置當前顏色為藍色不透明

          glVertex3f(0.0, -0.366, 0.5) # 設置三角形頂點

          glEnd # 結束繪制三角形

          # ---------------------------------------------------------------

          glutSwapBuffers # 切換緩沖區,以顯示繪制內容

          def reshape(width, height):

          global WIN_W, WIN_H

          WIN_W, WIN_H = width, height

          glutPostRedisplay

          def mouseclick(button, state, x, y):

          global SCALE_K

          global LEFT_IS_DOWNED

          global MOUSE_X, MOUSE_Y

          MOUSE_X, MOUSE_Y = x, y

          if button == GLUT_LEFT_BUTTON:

          LEFT_IS_DOWNED = state==GLUT_DOWN

          elif button == 3:

          SCALE_K *= 1.05

          glutPostRedisplay

          elif button == 4:

          SCALE_K *= 0.95

          glutPostRedisplay

          def mousemotion(x, y):

          global LEFT_IS_DOWNED

          global EYE, EYE_UP

          global MOUSE_X, MOUSE_Y

          global DIST, PHI, THETA

          global WIN_W, WIN_H

          if LEFT_IS_DOWNED:

          dx = MOUSE_X - x

          dy = y - MOUSE_Y

          MOUSE_X, MOUSE_Y = x, y

          PHI += 2*np.pi*dy/WIN_H

          PHI %= 2*np.pi

          THETA += 2*np.pi*dx/WIN_W

          THETA %= 2*np.pi

          r = DIST*np.cos(PHI)

          EYE[1] = DIST*np.sin(PHI)

          EYE[0] = r*np.sin(THETA)

          EYE[2] = r*np.cos(THETA)

          if 0.5*np.pi < PHI < 1.5*np.pi:

          EYE_UP[1] = -1.0

          else:

          EYE_UP[1] = 1.0

          glutPostRedisplay

          def keydown(key, x, y):

          global DIST, PHI, THETA

          global EYE, LOOK_AT, EYE_UP

          global IS_PERSPECTIVE, VIEW

          if key in [b'x', b'X', b'y', b'Y', b'z', b'Z']:

          if key == b'x': # 瞄準參考點 x 減小

          LOOK_AT[0] -= 0.01

          elif key == b'X': # 瞄準參考 x 增大

          LOOK_AT[0] += 0.01

          elif key == b'y': # 瞄準參考點 y 減小

          LOOK_AT[1] -= 0.01

          elif key == b'Y': # 瞄準參考點 y 增大

          LOOK_AT[1] += 0.01

          elif key == b'z': # 瞄準參考點 z 減小

          LOOK_AT[2] -= 0.01

          elif key == b'Z': # 瞄準參考點 z 增大

          LOOK_AT[2] += 0.01

          DIST, PHI, THETA = getposture

          glutPostRedisplay

          elif key == b'\r': # 回車鍵,視點前進

          EYE = LOOK_AT + (EYE - LOOK_AT) * 0.9

          DIST, PHI, THETA = getposture

          glutPostRedisplay

          elif key == b'\x08': # 退格鍵,視點后退

          EYE = LOOK_AT + (EYE - LOOK_AT) * 1.1

          DIST, PHI, THETA = getposture

          glutPostRedisplay

          elif key == b' ': # 空格鍵,切換投影模式

          IS_PERSPECTIVE = not IS_PERSPECTIVE

          glutPostRedisplay

          if __name__ == "__main__":

          glutInit

          displayMode = GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH

          glutInitDisplayMode(displayMode)

          glutInitWindowSize(WIN_W, WIN_H)

          glutInitWindowPosition(300, 200)

          glutCreateWindow('Quidam Of OpenGL')

          init # 初始化畫布

          glutDisplayFunc(draw) # 注冊回調函數draw

          glutReshapeFunc(reshape) # 注冊響應窗口改變的函數reshape

          glutMouseFunc(mouseclick) # 注冊響應鼠標點擊的函數mouseclick

          glutMotionFunc(mousemotion) # 注冊響應鼠標拖拽的函數mousemotion

          glutKeyboardFunc(keydown) # 注冊鍵盤輸入的函數keydown

          glutMainLoop # 進入glut主循環

          十二、小結

          雖然還有很多領域需要我們繼續探索,比如燈光、材質、霧化、拾取等,但那不是奇幻之旅的目標。奇幻之旅僅僅是幫助讀者建立 OpenGL 的基本概念。至此,我們基本完成了任務。

          加速渲染

          實際應用 OpenGL 繪制三維圖像時,往往需要處理數以萬計的頂點,有時甚至是百萬級、千萬級。我們通常不會在繪制函數里面傳送這些數據,而是在繪制之前,將這些數據提前傳送到GPU。繪制函數每次繪制時,只需要從GPU的緩存中取出數據即可,極大地提高了效率。這個機制地實現,依賴于頂點緩沖區對象(Vertex Buffer Object),簡稱VBO。

          盡管 VBO 是顯卡的擴展,其實沒有用到GPU運算,也就是說 VBO 不用寫著色語言,直接用opengl函數就可以調用,主要目的是用于加快渲染的速。

          VBO 將頂點信息放到 GPU 中,GPU 在渲染時去緩存中取數據,二者中間的橋梁是 GL-Context。GL-Context 整個程序一般只有一個,所以如果一個渲染流程里有兩份不同的繪制代碼,GL-context 就負責在他們之間進行切換。這也是為什么要在渲染過程中,在每份繪制代碼之中會有 glBindbuffer、glEnableVertexAttribArray、glVertexAttribPointer。如果把這些都放到初始化時候完成,使用一種結構記錄該次繪制所需要的所有 VBO 所需信息,把它保存到 VBO特定位置,繪制的時候直接在這個位置取信息繪制,會簡化渲染流程、提升渲染速度。這就是 VAO 概念產生的初衷。

          VAO 的全名是 Vertex Array Object,首先,它不是 Buffer-Object,所以不用作存儲數據;其次,它針對“頂點”而言,也就是說它跟“頂點的繪制”息息相關。VAO 記錄的是一次繪制中所需要的信息,這包括“數據在哪里 glBindBuffer”、“數據的格式是怎么樣的 glVertexAttribPointer”、shader-attribute 的 location 的啟用 glEnableVertexAttribArray。

          根據我查到的資料,幾乎所有的顯卡都支持 VBO,但不是所有的顯卡都支持 VAO,而 VAO 僅僅是優化了 VBO 的使用方法,對于加速并沒有實質性的影響,因此本文只討論 VBO 技術。

          一、創建頂點緩沖區對象(VBO)

          假定畫一個六面體,頂點是這樣的:

          # -*- coding: utf-8 -*-

          # 六面體數據

          # ------------------------------------------------------

          # v4----- v5

          # /| /|

          # v0------v1|

          # | | | |

          # | v7----|-v6

          # |/ |/

          # v3------v2

          # 頂點集

          vertices = np.array([

          -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, # v0-v1-v2-v3

          -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5 # v4-v5-v6-v7

          ], dtype=np.float32)

          # 索引集

          indices = np.array([

          0, 1, 2, 3, # v0-v1-v2-v3 (front)

          4, 5, 1, 0, # v4-v5-v1-v0 (top)

          3, 2, 6, 7, # v3-v2-v6-v7 (bottom)

          5, 4, 7, 6, # v5-v4-v7-v6 (back)

          1, 5, 6, 2, # v1-v5-v6-v2 (right)

          4, 0, 3, 7 # v4-v0-v3-v7 (left)

          ], dtype=np.int)

          在GPU上創建VBO如下:

          from OpenGL.arrays import vbo

          vbo_vertices = vbo.VBO(vertices)

          vbo_indices = vbo.VBO(indices, target=GL_ELEMENT_ARRAY_BUFFER)

          創建 頂點 VBO 時,默認 target=GL_ARRAY_BUFFER, 而創建索引 VBO 時,target=GL_ELEMENT_ARRAY_BUFFER,因為頂點的數據類型是 np.float32,索引的數據類型是np.int。

          在VBO保存的頂點數據集,除了頂點信息外,還可以包含顏色、法線、紋理等數據,這就是頂點混合數組的概念。假定我們在上面的頂點集中增加每個頂點的顏色,則可以寫成這樣:

          vertices = np.array([

          0.3, 0.6, 0.9, -0.35, 0.35, 0.35, # c0-v0

          0.6, 0.9, 0.3, 0.35, 0.35, 0.35, # c1-v1

          0.9, 0.3, 0.6, 0.35, -0.35, 0.35, # c2-v2

          0.3, 0.9, 0.6, -0.35, -0.35, 0.35, # c3-v3

          0.6, 0.3, 0.9, -0.35, 0.35, -0.35, # c4-v4

          0.9, 0.6, 0.3, 0.35, 0.35, -0.35, # c5-v5

          0.3, 0.9, 0.9, 0.35, -0.35, -0.35, # c6-v6

          0.9, 0.9, 0.3, -0.35, -0.35, -0.35 # c7-v7

          ], dtype=np.float32)

          二、分離頂點混合數組

          使用 glInterleavedArrays 函數可以從頂點混合數組中分離頂點、顏色、法線和紋理。比如,對只包含頂點信息的頂點混合數組:

          vbo_indices.bind

          glInterleavedArrays(GL_V3F, 0, None)

          如果頂點混合數組包含了顏色和頂點信息:

          vbo_indices.bind

          glInterleavedArrays(GL_C3F_V3F, 0, None)

          glInterleavedArrays 函數第一個參數總共有14個選項,分別是:

          • GL_V2F

          • GL_V3F

          • GL_C4UB_V2F

          • GL_C4UB_V3F

          • GL_C3F_V3F

          • GL_N3F_V3F

          • GL_C4F_N3F_V3F

          • GL_T2F_V3F

          • GL_T4F_V4F

          • GL_T2F_C4UB_V3F

          • GL_T2F_C3F_V3F

          • GL_T2F_N3F_V3F

          • GL_T2F_C4F_N3F_V3F

          • GL_T4F_C4F_N3F_V4F

          三、使用頂點緩沖區對象(VBO)

          使用glDrawElements 等函數繪制前,需要先綁定頂點數據集和索引數據集,然后使用glInterleavedArrays 分理出頂點、顏色、法線等數據。

          vbo_indices.bind

          glInterleavedArrays(GL_V3F, 0, None)

          vbo_indices.bind

          glDrawElements(GL_QUADS, int(vbo_indices .size/4), GL_UNSIGNED_INT, None)

          vbo_indices.unbind

          vbo_indices.unbind

          致謝:

          寫作過程中,我參考了很多資料,包括紙質書籍和網頁,列寫于此,一并致謝!

          • 《OpenGL編程精粹》楊柏林 陳根浪 徐靜 編著

          • Opengl開發庫介紹

          • OpenGL的API函數使用手冊

          • glut處理鼠標事件

          • Learn OpenGL

          原文:https://blog.csdn.net/xufive/article/details/86565130

          聲明:本文系CSDN博客原創文章,轉載請聯系原作者。

          【End】

          “只講技術,拒絕空談!”2019 AI開發者大會將于9月6日-7日在北京舉行,這一屆AI開發者大會有哪些亮點?一線公司的大牛們都在關注什么?AI行業的風向是什么?2019 AI開發者大會,傾聽大牛分享,聚焦技術實踐,和萬千開發者共成長。

          目前,大會盲訂票限量發售中~掃碼購票,領先一步!


          主站蜘蛛池模板: 国产a∨精品一区二区三区不卡| 久久无码人妻一区二区三区午夜| 亚洲av无码一区二区三区人妖| 日韩AV无码一区二区三区不卡毛片| 搜日本一区二区三区免费高清视频| 久久久99精品一区二区| 亚洲av无码一区二区乱子伦as| 精品日韩一区二区| 色窝窝无码一区二区三区| 激情久久av一区av二区av三区| 免费日本一区二区| 国产区精品一区二区不卡中文| 欧美日韩国产免费一区二区三区| 亚洲日韩精品一区二区三区 | 69久久精品无码一区二区| 无码av不卡一区二区三区| 99偷拍视频精品一区二区| 国产日本亚洲一区二区三区| 国产丝袜美女一区二区三区| 国产午夜精品一区二区三区不卡 | 日韩一区二区三区在线精品| 亚洲av无一区二区三区| 亚洲欧美日韩一区二区三区在线| 国产午夜精品一区二区三区嫩草| 国产美女av在线一区| 国产午夜精品一区理论片飘花| 中文字幕精品亚洲无线码一区应用 | 内射一区二区精品视频在线观看| 一本久久精品一区二区| 国语对白一区二区三区| 日韩视频一区二区| 成人免费av一区二区三区| 国精产品一区一区三区| 亚洲一区二区三区无码国产| 中文字幕一区二区三区人妻少妇| 日韩精品免费一区二区三区| 日韩电影在线观看第一区| 一区二区中文字幕| 一区二区三区美女视频| 国产欧美色一区二区三区 | 国产精品亚洲综合一区|